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

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

其中DynamicDataSourceCreator dynamicDataSourceCreator = new DynamicDataSourceCreator();

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

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

这里的properties就是DynamicDataSourceProperties,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

DynamicDataSourceAutoConfiguration

DynamicDataSourceCreator

YmlDynamicDataSourceProvider

DynamicRoutingDataSource

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 2021-08-24
  • 2022-12-23
  • 2022-02-03
  • 2022-12-23
  • 2022-02-21
  • 2022-12-23
  • 2021-11-19
  • 2021-08-10
猜你喜欢
  • 2021-10-28
  • 2021-09-17
  • 2023-03-21
  • 2022-12-23
  • 2022-12-23
  • 2021-10-02
相关资源
相似解决方案