根據上篇教程寫自定義註解分爲三步1.定義註解格式 2. 配置元註解 3.定義參數 4.定義註解邏輯
本篇以寫多數據源切換註解爲例子,來了解寫自定義註解的過程,多數據源切換註解邏輯爲:在方法上可以使用這個註解,根據註解屬性,執行當前方法前切換到對應的數據源。
1.定義註解格式
public @interface ChooseDataSource {
}
2. 配置元註解
定義註解可以使用的位置方法等地方,註解的生命週期。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ChooseDataSource {
}
3.定義參數
設置參數爲枚舉,配置default默認值爲主數據源。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ChooseDataSource {
AllDatasourceEnum dataSource() default AllDatasourceEnum.MASTER;
}
4.定義註解邏輯
(1)自定義的註解:ChooseDataSource
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ChooseDataSource {
AllDatasourceEnum dataSource() default AllDatasourceEnum.MASTER;
}
(2)具體邏輯使用(aop在調用註解前攔截)和(反射獲取註解和執行方法)
爲了演示所以代碼簡單一點,多數據源的代碼這裏就不寫了(想了解相關的看另外一篇博客配置springboot多數據源:https://blog.csdn.net/Mint6/article/details/92261790)本篇只要知道DynamicDataSourceContextHolder.setDateSoureType("主")設置什麼字符串就會選擇對應的數據源就好了
代碼整體執行邏輯:通過aop攔截對應包內的方法,在執行前後,判斷是否存在註解,如果存在取出來屬性dataSource設置DynamicDataSourceContextHolder.setDateSoureType("主")來切換數據源。
制定註解生效範圍:其中: @Before("execution(public * com.fast.framework.dao.*.*.*(..)) || @annotation(com.fast.framework.annotation.ChooseDataSource)
")就是我設置的註解執行生效範圍:如果在com.fast.framework.dao這個包下和使用ChooseDataSource這個註解的方法,註解執行邏輯生效。這話如果不在這個包下面的註解,使用無效。
@Before("execution(public * com.fast.framework.dao.*.*.*(..)) || @annotation(com.fast.framework.annotation.ChooseDataSource)")
public void before(JoinPoint joinPoint) {
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
/*獲取方法上的註解*/
ChooseDataSource chooseDataSource = method.getAnnotation(ChooseDataSource.class);
//獲取註解上的數據源的值的信息
String dataSourceName = chooseDataSource.dataSource().name();
if (dataSourceName != null) {
//給當前的執行SQL的操作設置特殊的數據源的信息
DynamicDataSourceContextHolder.setDateSoureType(dataSourceName);
}
}
(3)枚舉類:AllDatasourceEnum
public enum AllDatasourceEnum {
MASTER(0, "主數據庫"),
SECOND(1, "第二個數據庫");
private int code;
private String msg;
AllDatasourceEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
總結:本章demo應該挺好理解的,主要看第四步定義註解執行邏輯,不理解的看看系列前後文章消化一下。