springboot配置动态数据源
- 编写保存数据源选择key的容器类
public class RoutingDataSourceContext {
private static ThreadLocal<String> routingDataSourceKey = new ThreadLocal<>();
public RoutingDataSourceContext(String key){
routingDataSourceKey.set(key);
}
public static String getRoutingDataSourceKey(){
String s = routingDataSourceKey.get();
return s==null?"master":s;
}
public void close() {
routingDataSourceKey.remove();
}
}
- 编写AbstractRoutingDataSource的继承子类,重写determineCurrentLookupKey()方法
public class RoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return RoutingDataSourceContext.getRoutingDataSourceKey();
}
}
- 编写自定义的DataSource自动配置类来实现多个数据源bean的注册
@Configuration
public class MyDataSourceConfiguration {
Logger logger = LoggerFactory.getLogger(MyDataSourceConfiguration.class);
@ConfigurationProperties(prefix = "spring.druid.datasource.master")
@Bean
public DataSource masterDataSource(){
logger.info("create masterDataSource......");
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.druid.datasource.slave")
public DataSource slaveDataSource(){
logger.info("create slaveDataSource......");
return DataSourceBuilder.create().build();
}
//@Autowired 根据类型注入,若有多个则用下面注解根据名称注入
// @Qualifier("masterDataSource")
@Bean
@Primary
public DataSource primaryDataSource(
@Autowired @Qualifier("masterDataSource") DataSource masterDataSource,
@Autowired @Qualifier("slaveDataSource") DataSource slaveDataSource
){
logger.info("create primaryDataSource......");
//创建子类,封装dataSourceMap并赋值TargetDataSources,设置默认数据源DefaultTargetDataSource,
//这些属性都在spring提供的AbstractRoutingDataSource类中,数据源的选择,存放也在此类中
//TargetDataSources此map集合就是为了实现多数据源spring提供的map
RoutingDataSource routingDataSource = new RoutingDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("master",masterDataSource);
dataSourceMap.put("slave",slaveDataSource);
routingDataSource.setTargetDataSources(dataSourceMap);
routingDataSource.setDefaultTargetDataSource(masterDataSource);
//到此相当于我们自己完成了对AbstractRoutingDataSource一些属性的封装
return routingDataSource;
}
}
注意: 要在springboot启动类的@SpringbootApplication中排除原自动配置类
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})