系统启动首先加载多数据源自动配置类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