这个技巧应该也算在项目钟非常常见的技巧了
首先,创建一个annotation包,在包里写我们的代码:
@Target(XXXX)
@Retension(XXX)
public @interface CustomAnn {
}
@Target和@Retension基本是一定会有的两个注解
那么他们分别是什么含义呢?有什么作用呢?
@Target
- 功能:指定了注解可以应用于哪些程序元素(如类、方法、字段等)。
@Retention
- 功能:指定了注解在何时保留有效。
他们在注解里填充什么参数呢?
@Target
- 用来定义注解可以应用到哪些类型的Java元素上。它需要填充
ElementType
枚举类型的值,常见的枚举值包括:ElementType.TYPE
:用于类、接口(包括注解类型)或枚举声明。ElementType.FIELD
:用于字段、枚举常量。ElementType.METHOD
:用于方法声明(不包括构造函数)。ElementType.PARAMETER
:用于方法、构造函数或初始化程序参数声明。ElementType.CONSTRUCTOR
:用于构造函数声明。ElementType.LOCAL_VARIABLE
:用于局部变量声明。ElementType.ANNOTATION_TYPE
:用于注解类型声明。ElementType.PACKAGE
:用于包声明。
@Retention
- 它用来控制自定义注解在编译和运行时的可见性及生命周期。它需要填充
RetentionPolicy
枚举类型的值,有以下三种策略可选:RetentionPolicy.SOURCE
:注解只保留在源代码级别,编译器编译后该注解将被丢弃,不会包含在.class文件中,因此运行时无法访问到。RetentionPolicy.CLASS
:注解保留在编译后的.class文件中,但JVM在运行时不加载它,所以运行时也无法通过反射获取到这个注解信息。RetentionPolicy.RUNTIME
:注解不仅保留在.class文件中,而且能在运行时通过反射API读取到注解信息。
此外其中还可以添加其他的一些属性,以此来填充我们的注解:
在自定义注解类中添加成员属性的作用是为注解提供附加信息,使注解更具描述性和实用性。这些成员属性可以在使用注解时通过“键值对”的方式指定具体的值,使得注解能够携带更丰富的上下文信息。
其次,创建切面类:
创建切面类建议使用以下格式:
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethodExecution() {}
@Around("serviceMethodExecution()")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
// ...
}
@Before("serviceMethodExecution()")
public void beforeAdvice() {
// ...
}
即使用一个@Pointcut的注解的成员方法,来具体的实现和切入面的位置,这两端代码分离开,对代码复用性等都有显著提高。
切点表达式为重中之重,具体的可以参考AOP的常见使用方法-CSDN博客这篇博客,讲的很好,不要再夸了,再夸就不礼貌了。
最后在对应的地方加上我们的自定义注解就可以了
mapper里,impl里等等