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

findType(ClassLoader classLoader) {For (String name : DATA_ SOURCE TYPE_ NAMES) {try {return (Class) ClassUtils . forName(name ,classLoader);} catch (Exception ex) {//忽略 , 继续执行turn null;}}判断方法遍历了所支持的数据源类型( HikariDataSource、DataSource和BasicData-Source)的常量数组 , 然后分别通过类加载器进行加载 。 如果存在对应的类 , 则返回对应的 Class, 否则返回 null 。
了 解 了 内 部 类 PooledDataSourceCondition 之 后,我 们 继 续 看EmbeddedDatabaseCondition 的判断逻辑 。 在 getMatchOutcome 方法中 ,第一个便是根据 PooledDataSourceCondition 判断是否存在支持池化的数据源 , 存在则返回不匹配 。 然后,判 断 是 否 存 在 适 合 的 内 嵌 数据 库类型,该判断是通过枚举类EmbeddedDatabaseConnection 实现的 。
public enum EmbeddedDatabaseConnection {// 2改旺坡NONE(null, null, null),// H2 数据库链接H2(EmbeddedDatabaseType .H2 , "org.h2 . Driver", "jdbc :h2:mem:%s;DB_ CLOSE_DELAY=-1;DB_ CLOSE_ _ON_ EXIT=FALSE"),// Derby 数据库链接DERBY( EmbeddedDatabaseType . DERBY, "org . apache . derby . jdbc .EmbeddedDrive" , "jdbc : derby: memory:%s; create=true"),// HSQL 数据库链接HSQL (EmbeddedDatabaseType . HSQL, "org. hsqldb. jdbcDriver", "jdbc:hsqldb:mem:%s");public static EmbeddedDatabaseConnection get(ClassLoader classLoader)for ( EmbeddedDatabaseConnection candidate : EmbeddedDatabaseConne -ction. values()) {if (candidate != NONE return NONE ;}}枚举类 EmbeddedDatabaseConnection 中定义了支持的数据库连接类型、驱动类名、urI以及相关工具的方法 。 通过枚举项的定义 , 我们也可以看出 Spring Boot 内嵌的 DataSource支持 HSQL、H2、 DERBY 这 3 种数据库 。
程序在调用 get 方法时会遍历枚举类中定义的枚举项 , 然后尝试加载驱动类名来判断该类是否存在 。 如果存在则返回对应的 EmbeddedDatabaseConnection 枚举项;如果不存在 , 则返回 NONE 。
在 EmbeddedDatabaseCondition 的 代 码 中,通 过 get 方 法 先 获 得EmbeddedDatabaseConnection , 然后通过 getType 方法获得 EmbeddedDatabaseType类型 , 判断其是否为 null 。 如果为 null, 则表示该类加载器中不存在默认的内嵌数据库类型 , 返回不匹配 。 经过以上两轮判断之后 , 其他情况则表示匹配 。
通这 EmbeddedDatabaseCondition 上@Conditional(EmbeddedDatabaseCondition.class)注解 , 我们已经把 DataSourceAutoConfiguration 中关于 Condition 的内部类讲解完毕 。 下面 继 续 看 EmbeddedDatabaseCondition 上 的 通 过 @Import 引 入 的 配 置 类EmbeddedDataSource-Configuration 。
EmbeddedDataSourceConfiguration 的主要作用是对内嵌数据源进行配置 。 由于该类需要用到类加载器 , 因此实现了 BeanClassLoaderAware,将 ClassL oader 暴露出来了 。
@Configuration(proxyBeanMethods = false)@EnableConf igurationProperties (DataSourceProperties . class)public class EmbeddedDataSourceConfiguration implements BeanClassL oaderAware{private ClassLoader classLoader;@0verridepublic void setBeanClassLoader(ClassLoader classLoader) {this. classLoader = classLoader;@Bean(destroyMethod = "shutdown")public EmbeddedDatabase dataSource (DataSourceProperties properties) {return new EmbeddedDatabaseBuilder(). setType( EmbeddedDatabaseConnec -tion. get(this. classLoader). getType()). setName(properties . determineDatabaseName()). build();}}我们重点看以上代码中的 dataSource 方法 , 该方法的注解指定了销毁方法为“shutdown” , 也 就 是 EmbeddedDatabase 的 shutdown 方 法。在 方 法 内 部,首 先 创 建 了 一 个Embedded-DatabaseBuilder,用于构建内嵌数据库 EmbeddedDatabase 。 根据命名可知Embedded-DatabaseBuilder 是可以链式调用的 。
因此 , EmbeddedDatabaseBuilder 连续调用 了设置数据库类型(. 上面已经讲到获取实现)、设置内嵌数据库名称 。 最后 , 通过 build 方法完成 EmbeddedDatabase 的构建 , 并注入容器 。
至此 , 关于 EmbeddedDatabaseConfiguration 相关的 自动配置已经讲解完毕 。 在下节 , 我们将继续学习池化的数据源配置类 PooledDataSourceConfiguration 。
SpringBoot数据库配置源码解析:自动配置内部实现解析文章插图
PooledDataSourceConfiguration
除了支持内嵌的 DataSource , SpringBoot 还支持一些实现 Pool 的 DataSource 。 从上节讲到 的 DataSourceBuilder 的 静 态 数 组 可 以 看 出,目 前 支 持 com.zaxxer.hikari.Hikari-DataSourceorg.apache.tomcat.jdbc.pool.DataSource和org.apache.commons.dbcp2. Basic-DataSource 这 3 种 DataSource。而 性 能 更 加 优 秀 的HikariDataSource 作为了 Spring Boot 中的默认选项 。
在 DataSourceAutoConfiguration 中的 PooledDataSourceConfiguration 就是来完成实现Pool 的 DataSource 的实例化的 , 源代码如下 。