多数据源配置方式2:使用AOP切片方式,实现动态数据源切换
Mybatis自动配置中有这么一段代码:
@ConditionalOnSingleCandidate(DataSource.class)
意思是:当IOC容器中只有一个数据源DataSource,这个自动配置类才会生效。
所以如果我们配置文件中配置了多个数据源,自动配置类就会失效。
多数据源配置的情况下并不是多个数据源并存的,Spring提供了AbstractRoutingDataSource这样一个抽象类,使得能够在多数据源的情况下任意切换,相当于一个动态路由的作用,作者称之为动态数据源。因此Mybatis只需要配置这个动态数据源即可。
继承AbstractDatasSource,实现DataSource(所以AbstractRoutingDataSource就是一个标准的数据源)
targetDataSources
: AbstractRoutingDataSource中有一个targetDataSources,存储多个数据源的配置,**private** **Map**<**Object**, **Object**> targetDataSources;
根据不同的key选择不同的datasource,创建对应的SessionFactory
defaultTargetDataSources
: 标明默认数据源是哪个
determineCurrentLookupKey()
: 这个方法的返回值决定了需要切换的数据源的KEY,就是根据这个KEY从targetDataSources取值(数据源)。