多数据源配置方式2:使用AOP切片方式,实现动态数据源切换

Mybatis自动配置中有这么一段代码:

@ConditionalOnSingleCandidate(DataSource.class)

意思是:当IOC容器中只有一个数据源DataSource,这个自动配置类才会生效。

所以如果我们配置文件中配置了多个数据源,自动配置类就会失效。

多数据源配置的情况下并不是多个数据源并存的,Spring提供了AbstractRoutingDataSource这样一个抽象类,使得能够在多数据源的情况下任意切换,相当于一个动态路由的作用,作者称之为动态数据源。因此Mybatis只需要配置这个动态数据源即可。

数据源动态切换源码解读

AbstractRoutingDataSource 抽象类

继承AbstractDatasSource,实现DataSource(所以AbstractRoutingDataSource就是一个标准的数据源)

targetDataSources: AbstractRoutingDataSource中有一个targetDataSources,存储多个数据源的配置,**private** **Map**<**Object**, **Object**> targetDataSources;

根据不同的key选择不同的datasource,创建对应的SessionFactory

defaultTargetDataSources: 标明默认数据源是哪个

determineCurrentLookupKey(): 这个方法的返回值决定了需要切换的数据源的KEY,就是根据这个KEY从targetDataSources取值(数据源)。

数据源切换如何保证线程隔离?