参考:廖雪峰博客
1.**application
标签必须添加,否则出现加载数据源无限循环 @EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@Bean("masterDataSource") @ConfigurationProperties(prefix = "spring.datasource") DataSource masterDataSource() { System.out.println("create master datasource..."); return DataSourceBuilder.create().build(); } /** * Slave (read only) data source. */ @Bean("slaveDataSource") @ConfigurationProperties(prefix = "spring.datasourceRed") DataSource slaveDataSource() { System.out.println("create slave datasource..."); return DataSourceBuilder.create().build(); } @Primary @Bean DataSource primaryDataSource( @Autowired @Qualifier("masterDataSource") DataSource masterDataSource, @Autowired @Qualifier("slaveDataSource") DataSource slaveDataSource ) { System.out.println("create routing datasource..."); Map<Object, Object> map = new HashMap<>(); map.put("masterDataSource", masterDataSource); map.put("slaveDataSource", slaveDataSource); RoutingDataSource routing = new RoutingDataSource(); routing.setTargetDataSources(map); routing.setDefaultTargetDataSource(masterDataSource); return routing; }
2.RoutingDataSource.java
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /** * @author:Administrator */ public class RoutingDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return RoutingDataSourceContext.getDataSourceRoutingKey(); } }
3.RoutingDataSourceContext.java
/** * @author:Administrator */ public class RoutingDataSourceContext { // holds data source key in thread local: static final ThreadLocal<String> threadLocalDataSourceKey = new ThreadLocal<>(); public static String getDataSourceRoutingKey() { String key = threadLocalDataSourceKey.get(); return key == null ? "masterDataSource" : key; } public RoutingDataSourceContext(String key) { threadLocalDataSourceKey.set(key); } public void close() { threadLocalDataSourceKey.remove(); } }
4.RoutingAspect.java
import com.pcitc.aims.project.common.config.RoutingDataSourceContext; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; /** * @author:Administrator * @date:2019/12/30 */ @Aspect @Component public class RoutingAspect { @Around("@annotation(routingWith)") public Object routingWithDataSource(ProceedingJoinPoint joinPoint, RoutingWith routingWith) throws Throwable { try { String key = routingWith.value(); RoutingDataSourceContext ctx = new RoutingDataSourceContext(key); }catch (Exception e){ e.printStackTrace(); }finally { return joinPoint.proceed(); } } }
5.RoutingWith.java
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author:Administrator */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface RoutingWith { String value() default ""; }