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应该挺好理解的,主要看第四步定义注解执行逻辑,不理解的看看系列前后文章消化一下。
还没有评论,来说两句吧...