SpringBoot数据库配置源码解析:自动配置内部实现解析( 三 )


@Configuration(proxyBeanMethods = false)@Conditional (PooledDataSourceCondition.class)@ConditionalOnMissingBean({ DataSource. class, XADataSource.class })@Import({ DataSourceConfiguration . Hikari. class, DataSourceConfiguration. Tomcat.class,DataSourceConfiguration. Dbcp2. class, DataSourceConfiguration. Generic. class,DataSourceJmxConfiguration.class })protected static class PooledDataSourceConfiguration {}}PooledDataSourceConfiguration 中同样没有具体实现 。 @Conditional 的筛选条件也是由内部类 PooledDataSourceCondition 来完成的 , 这些内容前面已经讲过 , 这里不再赘述 。 该实例化对象的优先级要高于内嵌 DataSource 的 。
我们重点看@lmport 引入的前 4 个类 , 它们是 DataSourceConfiguration 的内部类 , 提供了Hikari、Tomcat、 Dbcp2、 Generic 的 DataSource 配置 。
DataSourceConfiguration 就 是 用 于 DataSourceAutoConfiguration 导 入 的 实 际 的DataSource 配置 , 这里我们以 Hikari 为例来进行讲解 。 Hikari 是 spring-boot-starter-jdbc默认弓|入的数据源 , Hikari 相关自动配置代码如下 。
abstract class DataSourceConfiguration@SuppressWarnings ("unchecked" )protected staticT createDataSource(DataSourceProperties properties,Class type )return (T) properties . initializeDataSourceBuilder() . type(type) . buildQ);}@Configuration(proxyBeanMethods = false)@ConditionalOnClass (HikariDataSource.class)@Conditiona lOnMiss ingBean(DataSource.class)@ConditionalOnProperty(name = "spring . datasource. type",havingValue =http://kandian.youth.cn/index/”com. zaxxer. hikari. HikariDataSource",matchIfMissing = true)static class Hikari {@Bean@ConfigurationProperties(prefix = "spring . datasource . hikari")public HikariDataSource dataSource(DataSourceProperties properties) {HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);if (StringUtils . hasText(properties . getName())) {dataSource . setPoolName (properties . getName());return dataSource;}}}@ConditionalOnClass 指定必须在 classpath 中存在 HikariDataSource 才会进行实例化操作 。 而该类由 spring- boot-starter-jdbc 默认将其引入 , 因此当引入该 starter 时 , 只有 Hikari的自动配置满足条件 , 会被实例化 。
@ConditionalOnProperty 注 解 可 以 通 过 在 application.properties 文 件 中 配 置 key 为spring.datasource.type,值为com.zaxxer.hikari.HikariDataSource的配置项用来明确启动使用 Hikari 数据源 。 matchlfMissing 为 true, 说明如果没有配置则默认操作生效 。
Hikari 类 内 部 的 Bean 代 码 很 简 单,主 要 是 调 用 DataSourceConfiguration 的createData-Source 方法实例化 HikariDataSource 。
在 createDataSource 方法中 , 使用 DataSourceProperties 的 initializeDataSourceBuilder来初始化 DataSourceBuilder,源码如下 。
public DataSourceBuilder initializeDataSourceBuilder() {return DataSourceBuilder . create(getClassLoader()). type (getType()) .driver-ClassName(determineDriverClassName()). url(determineUrl()). username (determineUsername()) . password(determinePassword());}}initializeDataSourceBuilder 方 法 是 通 过 DataSourceBuilder 的 create 创 建 了DataSource-Builder 对象 , 并依次设置数据源类型、驱动类名、连接 url、 用户名和密码等信息 。 其中上述部分默认参数获取的方法名均为 determine 开头 , 也就是说在获取的过程中进行了一些推断及默认值的设定 , 该实现逻辑很简单 , 读者朋友可以自行查看 。
createDataSource 中 获 得 了 DataSourceBuilder 之 后,设 置 其 type 为HikariDataSource.class 便进行了 HikariDataSource 的初始化 。 在 dataSource 方法中获得该初始化对象 , 并设置了连接池的名字 , 注入容器中 。
PooledDataSourceConfiguration 最后导入了 DataSourceJmxConfiguration 配置类 , 主要用于配置与数据源相关的 MBean,非核心内容就不再展开了 。
【SpringBoot数据库配置源码解析:自动配置内部实现解析】至此 , 关于 DataSourceAutoConfiguration 自动配置 相关的内容便讲解完了 。
本文给大家讲解的内容是SpringBoot数据库配置源码解析:自动配置内部实现解析

  1. 下篇文章给大家讲解的是Jdbc Template 实例化操作;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!