java注解通俗易懂系列教程三之自定义注解demo

布满荆棘的人生 2023-06-27 06:19 43阅读 0赞

根据上篇教程写自定义注解分为三步1.定义注解格式 2. 配置元注解 3.定义参数 4.定义注解逻辑

本篇以写多数据源切换注解为例子,来了解写自定义注解的过程,多数据源切换注解逻辑为:在方法上可以使用这个注解,根据注解属性,执行当前方法前切换到对应的数据源。

1.定义注解格式

  1. public @interface ChooseDataSource {
  2. }

2. 配置元注解

定义注解可以使用的位置方法等地方,注解的生命周期。

  1. @Target({ElementType.METHOD, ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface ChooseDataSource {
  5. }

3.定义参数

设置参数为枚举,配置default默认值为主数据源。

  1. @Target({ElementType.METHOD, ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface ChooseDataSource {
  5. AllDatasourceEnum dataSource() default AllDatasourceEnum.MASTER;
  6. }

4.定义注解逻辑

(1)自定义的注解:ChooseDataSource

  1. @Target({ElementType.METHOD, ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface ChooseDataSource {
  5. AllDatasourceEnum dataSource() default AllDatasourceEnum.MASTER;
  6. }

(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这个注解的方法,注解执行逻辑生效。这话如果不在这个包下面的注解,使用无效。

  1. @Before("execution(public * com.fast.framework.dao.*.*.*(..)) || @annotation(com.fast.framework.annotation.ChooseDataSource)")
  2. public void before(JoinPoint joinPoint) {
  3. Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
  4. /*获取方法上的注解*/
  5. ChooseDataSource chooseDataSource = method.getAnnotation(ChooseDataSource.class);
  6. //获取注解上的数据源的值的信息
  7. String dataSourceName = chooseDataSource.dataSource().name();
  8. if (dataSourceName != null) {
  9. //给当前的执行SQL的操作设置特殊的数据源的信息
  10. DynamicDataSourceContextHolder.setDateSoureType(dataSourceName);
  11. }
  12. }

(3)枚举类:AllDatasourceEnum

  1. public enum AllDatasourceEnum {
  2. MASTER(0, "主数据库"),
  3. SECOND(1, "第二个数据库");
  4. private int code;
  5. private String msg;
  6. AllDatasourceEnum(int code, String msg) {
  7. this.code = code;
  8. this.msg = msg;
  9. }
  10. public int getCode() {
  11. return code;
  12. }
  13. public String getMsg() {
  14. return msg;
  15. }
  16. }

总结:本章demo应该挺好理解的,主要看第四步定义注解执行逻辑,不理解的看看系列前后文章消化一下。

发表评论

表情:
评论列表 (有 0 条评论,43人围观)

还没有评论,来说两句吧...

相关阅读