免抵退稅在哪個(gè)網(wǎng)站做北京新聞最新消息
如果你項(xiàng)目中一直用的是 Spring Boot,那么恭喜你沒(méi)有經(jīng)歷過(guò)用 Spring 手動(dòng)集成其它框架的痛苦。
都說(shuō) Spring Boot 大大簡(jiǎn)化了 Spring 框架開(kāi)發(fā) Web 應(yīng)用的難度,這里我們通過(guò)配置 Hibernate 的兩種方式來(lái)深刻體會(huì)這一點(diǎn):
- 使用 Spring 框架集成 Hibernate 手動(dòng)配置
- 使用 Spring Boot 集成 Hibernate 自動(dòng)配置
Hibernate 手動(dòng)配置
我們先來(lái)看看,手動(dòng)配置 Hibernate 有多么麻煩。
第一步、引入JAP依賴
<!-- JPA 的相關(guān)依賴 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>6.1.4</version>
</dependency>
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>3.2.4</version>
</dependency>
第二步、引入Hibernate依賴
<!-- Hibernate作為JPA 實(shí)現(xiàn) -->
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.30.Final</version>
</dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.4.30.Final</version>
</dependency>
第三步、引入數(shù)據(jù)庫(kù)相關(guān)的依賴
<!-- JDBC 驅(qū)動(dòng)程序 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
</dependency><!-- 數(shù)據(jù)庫(kù)連接池 -->
<dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.10.0</version>
</dependency>
這么多個(gè)包,用哪些包?用什么版本?一般人誰(shuí)記得住!
更糟糕的是,如果運(yùn)氣不好,你還得花很多時(shí)間解決各個(gè)依賴之間的兼容問(wèn)題!
這還只是持久層的相關(guān)依賴,如果還要集成其它框架,工作量非常大!
第四步、配置數(shù)據(jù)源
在applicationContext.xml 中配置各種bean。
首先要配置的是數(shù)據(jù)源!
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"><property name="driverClass" value="com.mysql.cj.jdbc.Driver"/><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/><property name="user" value="root"/><property name="password" value="123456"/>
</bean>
第五步、配置實(shí)體管理器
定義實(shí)體管理器的 bean,并設(shè)置 JPA 實(shí)現(xiàn)類(lèi)(如 Hibernate)、數(shù)據(jù)源等屬性。
注意在早期的JPA版本中配置的是sessionFactory
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource" /><property name="packagesToScan" value="com.example.domain" /><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /></property>
</bean>
第六步、配置事務(wù)管理器
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
第七步、開(kāi)啟注解式事務(wù)
<tx:annotation-driven transaction-manager="transactionManager"/>
第八步、編寫(xiě)持久層代碼
到這里,你終于把 JPA (Hibernate) 用Spring集成好了,并且配置好了。
終于你可以開(kāi)始動(dòng)手寫(xiě)代碼了。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
Hibernate 自動(dòng)配置
在前面,我們經(jīng)歷千辛萬(wàn)苦終于用Spring 集成 Hibernate框架,并且配置好了。好了接下來(lái),你還要集成 Web、集成 Spring Security等等,你會(huì)不會(huì)暗暗叫苦呢?
前面的手動(dòng)配置存在很明顯的缺陷:
- 集成某個(gè)框架,我們需要記住所有必要的依賴;不然很容易拋出
NoSuchClassException
的異常。 - 我們還需要謹(jǐn)慎使用相關(guān)依賴的版本;不然很容易出現(xiàn)版本不兼容的情況。
- 上面的依賴和xml配置是模塊化的配置;100個(gè)項(xiàng)目有99個(gè)基本一致。
還在,Spring Boot 帶來(lái)了自動(dòng)配置的機(jī)制,它幫我們悄悄的完成了絕大部分的工作。
下面,我們看看通過(guò)Starter 和 自動(dòng)配置,集成和配置 Hibernate有多么的簡(jiǎn)易!
第一步、引入starter-data-jpa
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
第二步、引入數(shù)據(jù)庫(kù)驅(qū)動(dòng)
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
</dependency>
第三步、配置數(shù)據(jù)庫(kù)連接信息
在application.properties
中配置數(shù)據(jù)庫(kù)信息
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
到這里,我們就完成了 Spring Boot 對(duì) Hibernate的集成!
看看我們做了什么:
- 依賴中引入 starter-data-jpa 和 mysql驅(qū)動(dòng)兩個(gè)依賴!
- 只在主配置中配置了數(shù)據(jù)庫(kù)賬號(hào)密碼等最基本信息!
其它的事情,全部有 starter 和 自動(dòng)配置機(jī)制完成!
對(duì)比
starter
我們引入了一個(gè) starter
依賴,基本完成所有的依賴的配置。
可以看到傳遞依賴,會(huì)把必要的依賴都自動(dòng)包含進(jìn)來(lái)!
自動(dòng)配置
對(duì)于配置,其實(shí)就更容易理解了!其實(shí)我們?cè)凇笆謩?dòng)配置”中做的事情,都是必須的,比如創(chuàng)建配置 DataSource
、entityManagerFactory
、transactionManager
這些bean 并注入到Spring 容器中。
只不過(guò),自動(dòng)配置機(jī)制偷偷的幫我們做完了一切。
總結(jié)
通過(guò)手動(dòng)配置和自動(dòng)配置兩種方式集成 一個(gè)框架,我們可以強(qiáng)烈的感受到 Spring Boot的starter
和 自動(dòng)配置機(jī)制
的強(qiáng)大。
這對(duì)于我們專(zhuān)欄后面,從原理和源碼級(jí)別理解 starter 和 自動(dòng)配置 機(jī)制是非常非常有幫助的!歡迎大家點(diǎn)贊收藏!后續(xù)的文章,我們會(huì)更深層次的角度去學(xué)習(xí)這兩個(gè)重點(diǎn)。