一、核心原理
动态数据源实现的核心类就是:AbstractRoutingDataSource,在这个类中有五个方法需要特别注意,分别如下:
//设置目标数据源
public void setTargetDataSources(Map<Object, Object> targetDataSources) {
this.targetDataSources = targetDataSources;
}
//设置默认数据源
public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
this.defaultTargetDataSource = defaultTargetDataSource;
}
//选择当前所需数据源
protected DataSource determineTargetDataSource() {
Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
Object lookupKey = this.determineCurrentLookupKey();
DataSource dataSource = (DataSource)this.resolvedDataSources.get(lookupKey);
if (dataSource == null && (this.lenientFallback || lookupKey == null)) {
dataSource = this.resolvedDefaultDataSource;
}
if (dataSource == null) {
throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
} else {
return dataSource;
}
}
@Nullable
//选择当前数据源所需K
protected abstract Object determineCurrentLookupKey();
//初始化resolveDataSources和defaultDataSources
public void afterPropertiesSet() {
if (this.targetDataSources == null) {
throw new IllegalArgumentException("Property 'targetDataSources' is required");
} else {
this.resolvedDataSources = new HashMap(this.targetDataSources.size());
this.targetDataSources.forEach((key, value) -> {
Object lookupKey = this.resolveSpecifiedLookupKey(key);
DataSource dataSource = this.resolveSpecifiedDataSource(value);
this.resolvedDataSources.put(lookupKey, dataSource);
});
if (this.defaultTargetDataSource != null) {
this.resolvedDefaultDataSource = this.resolveSp

本文详细介绍了SpringBoot2.X中动态数据源的核心原理,包括AbstractRoutingDataSource的重要方法,并通过七个步骤展示了如何实现动态数据源:配置常量、数据源上下文、重写AbstractRoutingDataSource、放入容器、自定义注解、注解切面处理和测试用例。
最低0.47元/天 解锁文章
611

被折叠的 条评论
为什么被折叠?



