springboot 数据库读写分离插件dynamic-datasource多数据源配置加载流程

系统启动首先加载多数据源自动配置类DynamicDataSourceAutoConfiguration并创建数据源创建器DynamicDataSourceCreator,如下图:

其中DynamicDataSourceCreator dynamicDataSourceCreator = new DynamicDataSourceCreator();

这行代码看看DynamicDataSourceCreator的默认构造方法吧,如下图:

这里的properties就是DynamicDataSourceProperties,

其中 dynamicDataSourceCreator.setDruidGlobalConfig(properties.getDruid());这行是根据配置文件信息设置druid全局配置看到已经加载的信息如下图:

这个时候dynamicDataSourceCreator已经构造完成,但是这个时候并没有创建真正的数据源信息

然后在当前类注入DynamicDataSourceProvider这个时候DynamicDataSourceCreator 已经注入了如下图:

我们来看看DynamicDataSourceProvider这个类的实现,原来DynamicDataSourceProvider是个接口

来看看看他的实现类,实现类有2个,一个基于YML数据源,一个基于JDBC数据源,如下图:

因为我们的数据源是yml格式的那我们直接看YmlDynamicDataSourceProvider,如下图:

构造方法呢根据传入的DynamicDataSourceProperties properties 配置文件信息,DynamicDataSourceCreator dynamicDataSourceCreator 数据源创建器来实例化自己,然后奇怪的事情发生了,当实例化DynamicDataSourceProvider之后呢,这个时候又跳转到了DynamicDataSourceAutoConfiguration这个类来配置DataSource了,如下图:

看下这个方法的上面有一个 @ConditionalOnMissingBean注解,需要注意的是注入DataSource的时候必须在DynamicDataSourceProvider已经实例化并且已经注入到容器后才注入DataSource,注入完之后进入DynamicRoutingDataSource这个类中调用了afterPropertiesSet()方法如下图:

来分析一下这个方法:Map<String, DataSource> dataSources = provider.loadDataSources();

这里的provider,对就是这个其实就是我们刚才实例化完的DynamicDataSourceProvider接口实现类

YmlDynamicDataSourceProvider,调用YmlDynamicDataSourceProvider里的loadDataSources()方法

没什么好说的看下loadDataSources()这个方法,如下图:

第一行 Map<String, DataSourceProperty> dataSourcePropertiesMap = properties.getDatasource();

当前已经加载的配置的数据源的配置信息,这个时候仅仅是从配置文件中读取的并没有真正创建数据源,如下图:

继续直到这行代码 dataSourceMap.put(pollName,dynamicDataSourceCreator.createDataSource(dataSourceProperty));

才真正的创建数据源信息进入DynamicDataSourceCreator.createDataSource()方法,如下图:

根据配置的不同创建不同类型的dataSource这里就不继续进入跟踪了。

到这里数据源的加载过程就结束了。

这其中几个比较关键的类:

DynamicDataSourceAutoConfiguration

DynamicDataSourceCreator

YmlDynamicDataSourceProvider

DynamicRoutingDataSource

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值