Springboot 模块分析 —— DataSourceAutoConfiguration 解析

本文详细分析了Springboot的DataSourceAutoConfiguration,包括其功能概况、源码解析,特别是DataSourceProperties的配置和如何自定义数据源。在源码部分,探讨了初始化过程,如EmbeddedDatabaseConfiguration和PooledDataSourceConfiguration的作用。对于自定义数据源,文章介绍了使用DataSourceBuilder和@ConfigurationProperties注解的方法,并指出DataSourcePoolMetadataProvidersConfiguration仅包含默认数据源,若需扩展需自行定义。
摘要由CSDN通过智能技术生成

1 DataSourceAutoConfiguration 功能概况

  • 初始化 DataSourceProperties 配置文件
  • 初始化数据源
  • 执行 sql 文件
  • 为数据源注册一个 DataSourcePoolMetadataProvider 实例

2 源码分析

@Configuration
@ConditionalOnClass({
    DataSource.class, EmbeddedDatabaseType.class })
//2.1 从配置文件中映射 DataSource 的值
@EnableConfigurationProperties(DataSourceProperties.class)
//2.4/2.5
@Import({
    DataSourcePoolMetadataProvidersConfiguration.class,
      DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {
   

   //2.2 
   @Configuration
   //判断是否引入 内置数据库:H2,DERBY,HSQL
   @Conditional(EmbeddedDatabaseCondition.class)
   //如果这是没有DataSource/XADataSource 对应的 BeanDefinition,就通过导入 EmbeddedDataSourceConfiguration.class 来,配置内置数据库对应的数据源!!
   @ConditionalOnMissingBean({
    DataSource.class, XADataSource.class })
   @Import(EmbeddedDataSourceConfiguration.class)
   protected static class EmbeddedDatabaseConfiguration {
   }

   //2.3 
   @Configuration
   //判断是否引入依赖的数据源:HikariDataSource、tomcat.jdbc.pool.DataSource、BasicDataSource
   @Conditional(PooledDataSourceCondition.class)
   //如果这是没有DataSource/XADataSource 对应的 BeanDefinition,就通过以下属性的配置文件,配置数据源!!
   //配置数据源的时候,如果没有指定一些数据库的参数,就会报错哦
   @ConditionalOnMissingBean({
    DataSource.class, XADataSource.class })
   @Import({
    DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
         DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class,
         DataSourceJmxConfiguration.class })
   protected static class PooledDataSourceConfiguration {
   }
   
   //详细说明见 2.3
   static class PooledDataSourceCondition extends AnyNestedCondition {
   }
   //详细说明见 2.2
   static class EmbeddedDatabaseCondition extends SpringBootCondition {
   }
}

2.1 初始化 DataSourceProperties 配置文件

  • 如果设置的不是内置数据库的话:
    1)必须配置的有:url,username,password
    2)数据库名不是必须的
    3)driverClassName 不是必须的:可以从 url 中推导出
    4)type 不是必须的:可以从上下文中推导出
  • 如果设置的是内置数据库的话:
    1)必须配置的有:引入内置数据库依赖,如:H2
    2)其它所有的都可以不配置(有默认的配置),如果随意配置,可能产生冲突
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
   
	private ClassLoader classLoader;
    //数据库名:如果使用内置数据库,默认为testdb
	private String name;
	//Whether to generate a random datasource name
	private boolean generateUniqueName;
    //如果generateUniqueName==true,则不使用name,而使用uniqueName来做数据库名
    private String uniqueName;
    //完整的数据库连接池名。默认从项目中检测出
	private Class<? extends DataSource> type;
    //JDBC driver的完整名,默认从URL中检测出相对应的driver
	private String driverClassName;
    //JDBC URL of the database
	private String url;
    
	//Login username of the database
	private String username;
	//Login password of the database
	private String password;
    //JNDI 数据源的位置:如果指定了,则数据库连接数据将会失效:driverClassName,url,username,password
	private String jndiName;
	//初始化database使用的sql文件的模式,默认是EMBEDDED,如果是NONE就不会执行sql文件
    //如果设置的模式和检测出来的模式不匹配,也不会执行sql文件
	private DataSourceInitializationMode initializationMode = DataSourceInitializationMode.EMBEDDED;

    //执行sql文件相关,schema-${platform}.sql,data-${platform}.sql
    //默认执行不带 platform 的 sql 文件 + 带 platform 的 sql 文件
	private String platform = "all";
    //具体的 schema 文件的位置,如果指定了这个就不会查找默认的sql文件了
	private List<String> schema;
	//执行schema使用数据库的用户名
	private String schemaUsername;
	//执行schema使用数据库的密码,如果schemaUsername和schemaPassword都不指定,就使用 **主数据源** 作为执行目的数据库!
	private String schemaPassword;
	//同schema
	private List<String> data;
	private String dataUsername;
	private String dataPassword;
    
    //如果初始化database时报错,是否继续
	
  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值