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应该挺好理解的,主要看第四步定义注解执行逻辑,不理解的看看系列前后文章消化一下。

猜你喜欢

转载自blog.csdn.net/Mint6/article/details/103835990