学透Spring Boot — 004. Spring Boot Starter机制和自动配置机制

如果你项目中一直用的是 Spring Boot,那么恭喜你没有经历过用 Spring 手动集成其它框架的痛苦。

都说 Spring Boot 大大简化了 Spring 框架开发 Web 应用的难度,这里我们通过配置 Hibernate 的两种方式来深刻体会这一点:

  • 使用 Spring 框架集成 Hibernate 手动配置
  • 使用 Spring Boot 集成 Hibernate 自动配置

Hibernate 手动配置

我们先来看看,手动配置 Hibernate 有多么麻烦。

第一步、引入JAP依赖
xml 复制代码
<!-- 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依赖
xml 复制代码
<!-- 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>
第三步、引入数据库相关的依赖
xml 复制代码
<!-- 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。

首先要配置的是数据源!

xml 复制代码
<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

xml 复制代码
<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>
第六步、配置事务管理器
xml 复制代码
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
第七步、开启注解式事务
xml 复制代码
<tx:annotation-driven transaction-manager="transactionManager"/>
第八步、编写持久层代码

到这里,你终于把 JPA (Hibernate) 用Spring集成好了,并且配置好了。

终于你可以开始动手写代码了。

java 复制代码
@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
xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
第二步、引入数据库驱动
xml 复制代码
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>
第三步、配置数据库连接信息

application.properties中配置数据库信息

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 依赖,基本完成所有的依赖的配置。

可以看到传递依赖,会把必要的依赖都自动包含进来!

自动配置

对于配置,其实就更容易理解了!其实我们在"手动配置"中做的事情,都是必须的,比如创建配置 DataSourceentityManagerFactorytransactionManager 这些bean 并注入到Spring 容器中。

只不过,自动配置机制偷偷的帮我们做完了一切。

总结

通过手动配置和自动配置两种方式集成 一个框架,我们可以强烈的感受到 Spring Boot的starter自动配置机制的强大。

这对于我们专栏后面,从原理和源码级别理解 starter 和 自动配置 机制是非常非常有帮助的!欢迎大家点赞收藏!后续的文章,我们会更深层次的角度去学习这两个重点。

相关推荐
Carve_the_Code2 分钟前
分布式订单系统:订单号编码设计实战
java·后端
Home3 分钟前
23种设计模式之代理模式(结构型模式二)
java·后端
落枫595 分钟前
OncePerRequestFilter
后端
程序员西西5 分钟前
详细介绍Spring Boot中用到的JSON序列化技术?
java·后端
课程xingkeit与top5 分钟前
大数据硬核技能进阶:Spark3实战智能物业运营系统(完结)
后端
课程xingkeit与top5 分钟前
基于C++从0到1手写Linux高性能网络编程框架(超清)
后端
语落心生5 分钟前
探秘新一代向量存储格式Lance-format (二十二) 表达式与投影
后端
雨中飘荡的记忆5 分钟前
MySQL 优化实战
java·mysql
豆豆的java之旅8 分钟前
深入浅出Activity工作流:从理论到实践,让业务流转自动化
java·运维·自动化·activity·工作流
码事漫谈9 分钟前
音域之舞-基于Rokid CXR-M SDK的AI眼镜沉浸式K歌评分系统开发全解析
后端