上篇文章中已经借助 DynamicDataSourceBuilder
类从配置文件中解析得到了默认数据源和动态数据源,接下来需要配置动态数据源的“本体”,并借助 AOP 动态的切换数据源。
配置动态数据源
AbstractRoutingDataSource
实现了 InitializingBean
接口,在 afterPropertiesSet
方法中通过处理 targetDataSources
和 defaultTargetDataSource
中得到最终的 resolvedDefaultDataSource
和 resolvedDataSources
,我们的实现类(动态数据源“本体”)需要覆写该方法,从而给targetDataSources
和 defaultTargetDataSource
进行赋值。
可以看到第 118 行如果 targetDataSources
为 null 就会抛出异常,因此我们的导出类需要先进行赋值,再调用父类方法,动态数据源配置代码如下:
@Component
public class DynamicDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<DsKey> dataSourceKey = new InheritableThreadLocal<DsKey>() {
@Override
protected DsKey initialValue() {
return DsKey.DATASOURCE;
}
};
@Autowired
private DynamicDataSourceBuilder dynamicDataSourceBuilder;
// 维护数据源 key(Lookup key)
private static