数据源路由类
public class DynamicDataSource extends AbstractRoutingDataSource {
private final Map<String, DataSource> dynamicDataSources = Maps.newConcurrentMap();
private final DynamicDataSourceProvider dynamicDataSourceProvider;
public DynamicDataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
this.dynamicDataSourceProvider = dynamicDataSourceProvider;
this.dynamicDataSources.put("default", dynamicDataSourceProvider.defaultDataSource());
super.setTargetDataSources(
Collections.singletonMap("defalut", this.dynamicDataSources.get("default")));
}
@Override
protected String determineCurrentLookupKey() {
return this.dynamicDataSourceProvider.lookUpKey();
}
@Override
protected DataSource determineTargetDataSource() {
String key = this.determineCurrentLookupKey();
Preconditions.checkArgument(key != null, "determine target key must be not null");
DataSource dataSource =
this.dynamicDataSources.computeIfAbsent(
key, this.dynamicDataSourceProvider::createDataSource);
if (dataSource != null) {
return dataSource;
}
return Optional.ofNullable(this.dynamicDataSources.get("defalut"))
.orElse(super.determineTargetDataSource());
}
}
数据源提供接口
public interface DynamicDataSourceProvider {
String lookUpKey();
DataSource defaultDataSource();
DataSource createDataSource(String lookUpKey);
}
注册到Spring中
@Configuration(proxyBeanMethods = false)
public class DynamicDataSourceAutoConfiguration {
@Bean
@Primary
public DataSource dynamicDataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
return new DynamicDataSource(dynamicDataSourceProvider);
}
}
实现具体的数据源提供
@Component
public class GroupDataSource implements DynamicDataSourceProvider {
@Override
public String lookUpKey() {
//从这个方法提供数据源的Key
}
@Override
public DataSource defaultDataSource() {
//创建一个默认的数据源
}
@Override
public DataSource createDataSource(String lookUpKey) {
//根据动态的数据源Key创建数据源
}
}