@SpringBootApplication(scanbasePackages={"com.xxxx"},exclude = {DataSourceAutoConfiguration.class})
二、在application 定义数据源配置
#一 spring.datasource.network.url= spring.datasource.network.username= spring.datasource.network.password= #二 spring.datasource.sannong.url= spring.datasource.sannong.username= spring.datasource.sannong.password= #三 spring.datasource.zhifa.url= spring.datasource.zhifa.username= spring.datasource.zhifa.password=三、定义注解名称
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface DataSource {
String name() default "";
}
四、定义数据库名称
注意点:这个地方的名称对应的是上面application里面配置的名称
public interface DataSourceName {
String NETWORK = "network";
String SAN_NONG = "sannong";
String ZHI_FA = "zhifa";
}
五、定义配置类
@Configuration
public class DynamicDataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.network")
public DataSource firstDataSource(){
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.sannong")
public DataSource secondDataSource(){
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.zhifa")
public DataSource thirdDataSource(){
return DruidDataSourceBuilder.create().build();
}
@Bean
@Primary
public DynamicDataSource dataSource(DataSource firstDataSource, DataSource secondDataSource,DataSource thirdDataSource,DataSource fourthDataSource) {
Map
六、进行数据切换
public class DynamicDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal contextHolder = new ThreadLocal<>();
public DynamicDataSource(DataSource defaultTargetDataSource, Map
七、切面
注意点:代码里面的@Ponintcut注解内容指的是第三步的自定义注解名称DataSource
@Aspect
@Component
public class DataSourceAspect implements Ordered {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Pointcut("@annotation(com.xxx.datasource.anaotation.DataSource)")
public void dataSourcePointCut() {
}
@Around("dataSourcePointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
DataSource ds = method.getAnnotation(DataSource.class);
if(ds == null){
DynamicDataSource.setDataSource(DataSourceName.NETWORK);
logger.debug("set datasource is " + DataSourceName.NETWORK);
}else {
DynamicDataSource.setDataSource(ds.name());
logger.debug("set datasource is " + ds.name());
}
try {
return point.proceed();
} finally {
DynamicDataSource.clearDataSource();
logger.debug("clean datasource");
}
}
@Override
public int getOrder() {
return 1;
}
}
八、具体使用
在mapper层接口或者在service层接口加上@DataSource和你想要切换的名称,@DataSource就是你自定义注解的名称
@DataSource(name = DataSourceName.SAN_NONG)
List queryAllVillageInfo();



