如果你项目中一直用的是 Spring Boot,那么恭喜你没有经历过用 Spring 手动集成其它框架的痛苦。
都说 Spring Boot 大大简化了 Spring 框架开发 Web 应用的难度,这里我们通过配置 Hibernate 的两种方式来深刻体会这一点:
- 使用 Spring 框架集成 Hibernate 手动配置
- 使用 Spring Boot 集成 Hibernate 自动配置
Hibernate 手动配置
我们先来看看,手动配置 Hibernate 有多么麻烦。
第一步、引入JAP依赖
<!-- JPA 的相关依赖 -->
<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 实现 -->
<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>
第三步、引入数据库相关的依赖
<!-- JDBC 驱动程序 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.10.0</version>
</dependency>
这么多个包,用哪些包?用什么版本?一般人谁记得住!
更糟糕的是,如果运气不好,你还得花很多时间解决各个依赖之间的兼容问题!
这还只是持久层的相关依赖,如果还要集成其它框架,工作量非常大!
第四步、配置数据源
在applicationContext.xml 中配置各种bean。
首先要配置的是数据源!
<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>
第五步、配置实体管理器
定义实体管理器的 bean,并设置 JPA 实现类(如 Hibernate)、数据源等属性。
注意在早期的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>
第六步、配置事务管理器
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
第七步、开启注解式事务
<tx:annotation-driven transaction-manager="transactionManager"/>
第八步、编写持久层代码
到这里,你终于把 JPA (Hibernate) 用Spring集成好了,并且配置好了。
终于你可以开始动手写代码了。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
Hibernate 自动配置
在前面,我们经历千辛万苦终于用Spring 集成 Hibernate框架,并且配置好了。好了接下来,你还要集成 Web、集成 Spring Security等等,你会不会暗暗叫苦呢?
前面的手动配置存在很明显的缺陷:
- 集成某个框架,我们需要记住所有必要的依赖;不然很容易抛出
NoSuchClassException
的异常。 - 我们还需要谨慎使用相关依赖的版本;不然很容易出现版本不兼容的情况。
- 上面的依赖和xml配置是模块化的配置;100个项目有99个基本一致。
还在,Spring Boot 带来了自动配置的机制,它帮我们悄悄的完成了绝大部分的工作。
下面,我们看看通过Starter 和 自动配置,集成和配置 Hibernate有多么的简易!
第一步、引入starter-data-jpa
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
第二步、引入数据库驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
第三步、配置数据库连接信息
在application.properties
中配置数据库信息
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 对 Hibernate的集成!
看看我们做了什么:
- 依赖中引入 starter-data-jpa 和 mysql驱动两个依赖!
- 只在主配置中配置了数据库账号密码等最基本信息!
其它的事情,全部有 starter 和 自动配置机制完成!
对比
starter
我们引入了一个 starter
依赖,基本完成所有的依赖的配置。
可以看到传递依赖,会把必要的依赖都自动包含进来!
自动配置
对于配置,其实就更容易理解了!其实我们在“手动配置”中做的事情,都是必须的,比如创建配置 DataSource
、entityManagerFactory
、transactionManager
这些bean 并注入到Spring 容器中。
只不过,自动配置机制偷偷的帮我们做完了一切。
总结
通过手动配置和自动配置两种方式集成 一个框架,我们可以强烈的感受到 Spring Boot的starter
和 自动配置机制
的强大。
这对于我们专栏后面,从原理和源码级别理解 starter 和 自动配置 机制是非常非常有帮助的!欢迎大家点赞收藏!后续的文章,我们会更深层次的角度去学习这两个重点。