yml配置
数据源1
数据源2
step1. 创建自定义注解 DataSource
package com.hg.java.demo.common.annotions;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author: hg
* @Date: 2018/12/16 11:41
* @Version 1.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface DataSource {
String value() default "eams1";
}
step2. 创建AOP切面 DynamicDataSourceAspect
package com.hg.java.demo.common.aop;
import com.hg.java.demo.common.annotions.DataSource;
import com.hg.java.demo.common.datasource.DynamicDataSourceContextHolder;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* @Author: hg
* @Date: 2018/12/16 11:42
* @Version 1.0
*
* 自定义注解 + AOP的方式实现数据源动态切换。
*/
@Aspect
@Component
public class DynamicDataSourceAspect {
//定义切点
@Pointcut("@annotation(com.hg.java.demo.common.annotions.DataSource)")
public void dataSourcePointCut(){
}
/**
* 当使用该 @DataSource 注解时,执行前置方法,进行数据源切换
* @param point
*/
@Before("dataSourcePointCut()")
public void beforeSwitchDS(JoinPoint point){
//获得当前访问的class
Class<?> className = point.getTarget().getClass();
//获得访问的方法名
String methodName = point.getSignature().getName();
//得到方法的参数的类型
Class[] argClass = ((MethodSignature)point.getSignature()).getParameterTypes();
String dataSource = DynamicDataSourceContextHolder.DEFAULT_DS;
try {
// 得到访问的方法对象
Method method = className.getMethod(methodName, argClass);
// 判断是否存在@DS注解
if (method.isAnnotationPresent(DataSource.class)) {
DataSource annotation = method.getAnnotation(DataSource.class);
// 取出注解中的数据源名
dataSource = annotation.value();
}
} catch (Exception e) {
e.printStackTrace();
}
// 切换数据源
DynamicDataSourceContextHolder.setDataSourceType(dataSource);
}
/**
* 后置处理 清除数据源名
* @param point
*/
@After("dataSourcePointCut()")
public void afterSwitchDS(JoinPoint point){
DynamicDataSourceContextHolder.clearDataSourceType();
}
}
提示:DynamicDataSourceContextHolder类请查看博主上一篇:springboot2之系统架构基础(二.1)使用druid配置多数据源,集成mybatis(https://blog.csdn.net/nameIsHG/article/details/84958795)
controller 访问代码: