前言
前面介绍了SpringBoot的自动配置原理,用一句话概括是:启动时加载所有,最终按照条件进行装配。本章节表面上是讲数据访问,但其核心还是讲SpringBoot的自动配置,只不过自动配置的对象是数据库相关的依赖(如:druid、MyBatis、MyBatis-Plugs等)。这些依赖的导入与装配都是SpringBoot帮我们自动完成的。
SpringBoot默认使用的数据源是Hikari
(下面有源码分析),以后我们将使用阿里的Druid
数据源进行数据库相关配置与操作。
在本篇,我们可以知道:
- 数据源的自动配置原理(2.);
- SpringBoot整合第三方技术的两种方式(3.);
- SpringBoot在处理自动配置时的逻辑(3.2.2);
- Druid数据源自动配置原理(3.2.2);
可以直接跳转至第四点总结那查看源码结构图。
1. 数据源的自动配置
我们先基于SpringBoot默认的HikariDataSource数据源,导入JDBC场景,看看SpringBoot帮我们自动配置了什么。
首先导入JDBC场景依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
导入JDBC场景依赖后,我们可以在Maven的Dependencies依赖里看出spring-boot-starter-data-jdbc
自动帮我们引入了数据源、JDBC与事务相关jar包。

少了数据库连接驱动依赖
我们可以发现,这其中没有数据库连接驱动依赖,道理很简单,SpringBoot并不知道我们要使用什么数据库(MySQL还是Oracle或其他)。
直接在pom.xml文件里添加数据库驱动依赖即可
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
我们不用关注数据库驱动的版本,在SpringBoot里使用版本仲裁自动匹配( 数据库版本和驱动版本对应 ),当然,我们也可以自定义版本。
自定义连接驱动版本:
-
pom.xml
里dependency
直接依赖引入具体版本(maven的就近依赖原则)<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency>
-
pom.xml
里properties
重新声明版本(maven属性的就近优先原则)<properties> <java.version>1.8</java.version> <mysql.version>5.1.49</mysql.version> </properties>
2. *数据源自动配置源码分析
基于上面的例子,我们来剖析SpringBoot数据源的自动装配原理。
由于数据源的配置是SpringBoot帮我们自动配置的,因此我们在外部依赖库里找到jdbc相关的自动配置:

往下翻翻找到jdbc的包:

可以看到引入jdbc相关依赖后SpringBoot帮我们引入了很多自动配置类,如:
DataSourceAutoConfiguration
:数据源的自动配置类;DataSourceTransactionManagerAutoConfiguration
:事务管理器的自动配置;JdbcTemplateAutoConfiguration
:JdbcTemplate的自动配置,可以来对数据库进行crud(JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用);JndiDataSourceAutoConfiguration
:jndi的自动配置;XADataSourceAutoConfiguration
:分布式事务相关的自动配置;等......
我们对其中两个进行分析:
2.1 DataSourceAutoConfiguration:数据源自动配置类
解释了SpringBoot底层的数据源是Hikari;
其中DataSourceAutoConfiguration
是数据源的自动配置类,我们点进去看源码,发现其定义了一些静态方法,其中底层数据源相关的是:
@Configuration(proxyBeanMethods = false)
@Conditional({DataSourceAutoConfiguration.PooledDataSourceCondition.class})
@ConditionalOnMissingBean({DataSource.class, XADataSource.class})
@Import(