当前位置: 首页 > news >正文

DataSourceAutoConfiguration源码笔记

代码如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package org.springframework.boot.autoconfigure.jdbc;import javax.sql.DataSource;
import javax.sql.XADataSource;
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvidersConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.jdbc.EmbeddedDatabaseConnection;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ConfigurationCondition.ConfigurationPhase;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;@Configuration(proxyBeanMethods = false
)
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class})
public class DataSourceAutoConfiguration {public DataSourceAutoConfiguration() {}static class EmbeddedDatabaseCondition extends SpringBootCondition {private final SpringBootCondition pooledCondition = new PooledDataSourceCondition();EmbeddedDatabaseCondition() {}public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {ConditionMessage.Builder message = ConditionMessage.forCondition("EmbeddedDataSource", new Object[0]);if (this.anyMatches(context, metadata, new Condition[]{this.pooledCondition})) {return ConditionOutcome.noMatch(message.foundExactly("supported pooled data source"));} else {EmbeddedDatabaseType type = EmbeddedDatabaseConnection.get(context.getClassLoader()).getType();return type == null ? ConditionOutcome.noMatch(message.didNotFind("embedded database").atAll()) : ConditionOutcome.match(message.found("embedded database").items(new Object[]{type}));}}}static class PooledDataSourceAvailableCondition extends SpringBootCondition {PooledDataSourceAvailableCondition() {}public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {ConditionMessage.Builder message = ConditionMessage.forCondition("PooledDataSource", new Object[0]);return DataSourceBuilder.findType(context.getClassLoader()) != null ? ConditionOutcome.match(message.foundExactly("supported DataSource")) : ConditionOutcome.noMatch(message.didNotFind("supported DataSource").atAll());}}static class PooledDataSourceCondition extends AnyNestedCondition {PooledDataSourceCondition() {super(ConfigurationPhase.PARSE_CONFIGURATION);}@Conditional({PooledDataSourceAvailableCondition.class})static class PooledDataSourceAvailable {PooledDataSourceAvailable() {}}@ConditionalOnProperty(prefix = "spring.datasource",name = {"type"})static class ExplicitType {ExplicitType() {}}}@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 {protected PooledDataSourceConfiguration() {}}@Configuration(proxyBeanMethods = false)@Conditional({EmbeddedDatabaseCondition.class})@ConditionalOnMissingBean({DataSource.class, XADataSource.class})@Import({EmbeddedDataSourceConfiguration.class})protected static class EmbeddedDatabaseConfiguration {protected EmbeddedDatabaseConfiguration() {}}
}

分析@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})注解,

上面的类当同时存在DataSource.class和EmbeddedDatabaseType.class类才会自动导入

DataSourceAutoConfiguration,并且会通过@EnableConfigurationProperties注解读取相关的数据库的配置文件,点进DataSourceProperties该类可以看到它是一个配置类,上面有@ConfigurationProperties注解,该配置类会绑定以spring.datasource为前缀的配置数据,我们使用比较多的是在配置文件里面配置数据库的url,用户名,密码等等来和该类的做数据绑定。

接下来进入类里面,比较重要的是下面两个类的判断。

@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 {protected PooledDataSourceConfiguration() {}}@Configuration(proxyBeanMethods = false)@Conditional({EmbeddedDatabaseCondition.class})@ConditionalOnMissingBean({DataSource.class, XADataSource.class})@Import({EmbeddedDataSourceConfiguration.class})protected static class EmbeddedDatabaseConfiguration {protected EmbeddedDatabaseConfiguration() {}}

1.PooledDataSourceConfiguration类上注解

   1)@Conditional({PooledDataSourceCondition.class})

           首先PooledDataSourceCondition.class类要存在

    2)@ConditionalOnMissingBean({DataSource.class, XADataSource.class})

           这两个类其中一个不存在则成立

          (1)(2)两个都条件成立才注入PooledDataSourceConfiguration类

    3)@Import({DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class, DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class})

       这里面引入很多类型的数据源配置,当条件成立,PooledDataSourceConfiguration该类会去对应的数据源配置找数据。(找的都是池化类型的数据源,例如mysql的数据源)

2.EmbeddedDatabaseConfiguration类上注解

  1)@Conditional({EmbeddedDatabaseCondition.class})

     EmbeddedDatabaseCondition类存在为true

  2)@ConditionalOnMissingBean({DataSource.class, XADataSource.class})

      并且这两个类其中一个不存在则成立

      (1)(2)两个条件都成立才创建EmbeddedDatabaseConfiguration类

   3)@Import({EmbeddedDataSourceConfiguration.class})

       导入内嵌型的数据源配置

http://www.dtcms.com/a/339731.html

相关文章:

  • 47 C++ STL模板库16-容器8-关联容器-集合(set)多重集合(multiset)
  • Lec. 2: Pytorch, Resource Accounting 课程笔记
  • 告别手写文档!Spring Boot API 文档终极解决方案:SpringDoc OpenAPI
  • 一文速通Ruby语法
  • GeoTools 读取影像元数据
  • 常见 GC 收集器与适用场景:从吞吐量到亚毫秒停顿的全景指南
  • Kotlin 相关知识点
  • 驱动开发系列66 - glCompileShader实现 - GLSL中添加内置函数
  • 从“为什么”到“怎么做”——Linux Namespace 隔离实战全景地图
  • [激光原理与应用-309]:光学设计 - 什么是光学系统装配图,其用途、主要内容、格式与示例?
  • 线性基 系列
  • Java static关键字
  • OptiTrack光学跟踪系统,提高机器人活动精度
  • 讯飞星火语音大模型
  • CAD图纸如何批量转换成PDF格式?
  • 机器学习概念(面试题库)
  • 部署tomcat应用时注意事项
  • vue3+element-plus 输入框el-input设置背景颜色和字体颜色,样式效果等同于不可编辑的效果
  • t-SNE详解与实践【附代码】
  • 自定义组件可使用的方法
  • 在 Python 中操作 Excel 文件的高效方案 —— Aspose.Cells for Python
  • 《P1550 [USACO08OCT] Watering Hole G》
  • Java开发过程中实用的技术点(一)
  • 【矢量数据】1:250w中国地质图地断层数据/岩性shp数据
  • FlashAttention编译错误
  • Docker 搭建私有镜像仓库
  • 【C++】 C++11 智能指针
  • AI因子模型视角下的本周五鲍威尔演讲:通胀约束与就业压力的政策博弈
  • Spring Cloud系列—Seata分布式事务解决方案AT模式
  • 2025年6月中国电子学会青少年软件编程(图形化)等级考试试卷(一级)答案 + 解析