tips:新人小白的一点碎碎念,有不足的地方欢迎各位大佬指正和补充~
一、注解的基本作用
- 生成文档
- 跟踪代码的依赖性,实现替代配置文件功能
- 在编译时进行格式检查
二、元注解
元注解一共有四个,都可以在
java.lang.annotation
下找到
1)@Target
- @Target注解主要用于定义注解使用的位置,被描述的注解可以用在什么地方
@Target如果不设置范围的话默认可以作用于所有目标上面- @Target的参数是ElementType枚举类
枚举 | 作用 |
---|---|
ElementType.PACKAGE | 注解用于包 |
ElementType.TYPE | 作用于类型(类、接口、注解、枚举) |
ElementType.ANNOTATION_TYPE | 作用于注解 |
ElementType.CONSTRUCTOR | 作用于构造方法 |
ElementType.METHOD | 作用于方法 |
ElementType.PARAMETER | 作用于方法参数 |
ElementType.FIELD | 作用于属性 |
ElementType.LOCAL_VARIABLE | 作用于局部变量 |
2)@Retention
- @Retention注解的作用就是指定注解的生命周期
- @Retention的参数是RetentionPolicy枚举类
枚举 | 作用 |
---|---|
RetentionPolicy.SOURCE | 源码中保留,编译期可以处理 |
RetentionPolicy.CLASS(默认) | Class文件中保留,Class加载时可以处理 |
RetentionPolicy.RUNTIME | 运行时保留,运行中可以处理 |
3)@Documented
@Documented注解的主要作用是描述注解文档化。就是在生成javadoc的时候是不包含注释的,但是如果注释被@Documented修饰,则生成的文档就包含该注解
4)@Inherited
@Inherited注解修饰的注解是具有可继承性的,就是说我们用@Inherited修饰了一个类,那么这个类的子类也会默认继承此注解
三、AOP+自定义注解实现日志管理
1)自定义注解
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
/**
* 操作描述
*/
String value() default "";
/**
* 是否记录响应参数
*/
boolean recordRsponse() default false;
/**
* 请求参数列表
*/
String[] request() default {};
}
2)使用
@Log(value = "注册设备",recordRsponse = true,request = {"1:dto"})
public Result registerDevice(@RequestBody IbRegisterDeviceDto dto) {
//....
}
3)数据处理
@Aspect
@Component
public class OperationLogAspect {
private RestTemplate restTemplate;
private MongoTemplate mongoTemplate;
@Autowired
public OperationLogAspect(@Qualifier("defaultRestTemplate") RestTemplate restTemplate,
MongoTemplate mongoTemplate){
this.restTemplate=restTemplate;
this.mongoTemplate=mongoTemplate;
}
@Around("@annotation(annotation)")
public Object process(ProceedingJoinPoint joinPoint, Log annotation) throws Throwable {
Object proceed=joinPoint.proceed();
//....
return proceed;
}
}
参考原文档:https://blog.csdn.net/weixin_38328252/article/details/103557286