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

PooledDataSourceAvailableCondition 的判断逻辑非常简单 , 就是检查当前类加载器中是否存在指定的数据源对象 。 在判断的过程中使用到了 DataSourceBuilder 的 findType 方法 。
我们看一下相关代码 ,加深理解 。

public final class DataSourceBuilder {private static final String[] DATA_ SOURCE _TYPE_ NAMES = new String[] { "com. zaxxer. hikari. HikariDataSource","org. apache . tomcat. jdbc. pool.DataSource",' org . apache. commons . dbcp2.BasicDataSource" };@SuppressWarnings("unchecked")public static Class extends DataSource> findType(ClassLoader classLoader) {For (String name : DATA_ SOURCE TYPE_ NAMES) {try {return (Class extends DataSource>) 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 && ClassUtils. isPresent(candidate . getDriver-ClassName(), classLoader)) {return candidate;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 暴露出来了 。


推荐阅读