springboot2之系統架構基礎(三)使用自定義註解動態切換資料來源
阿新 • • 發佈:2018-12-30
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 訪問程式碼: