java註解通俗易懂系列教程三之自定義註解demo

根據上篇教程寫自定義註解分爲三步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應該挺好理解的,主要看第四步定義註解執行邏輯,不理解的看看系列前後文章消化一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章