1、什么是注解,官方给的解释:
注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。
2、注解使用的范围:
注解又许多用法,其中有:为编译器提供信息 - 注解能被编译器检测到错误或抑制警告。编译时和部署时的处理 - 软件工具能处理注解信息从而生成代码,XML文件等等。运行时的处理 - 有些注解在运行时能被检测到。
3、注解语法
注解在Java中,与类、接口、枚举类似,因此其声明语法基本一致,只是所使用的关键字有所不同@interface。在底层实现上,所有定义的注解都会自动继承java.lang.annotation.Annotation接口。
public @interface TestAnnotation {
}
4、常用的元注解
元注解:专门修饰注解的注解。它们都是为了更好的设计自定义注解的细节而专门设计的。
4.1、@Target注解,是专门用来限定某个自定义注解能够被应用在哪些Java元素上面的。
它使用一个枚举类型定义如下:
TYPE:类,接口(包括注解类型)或枚举的声明
FIELD:属性的声明
METHOD:方法的声明
PARAMETER:方法形式参数声明
CONSTRUCTOR:构造方法的声明
LOCAL_VARIABLE:局部变量声明
ANNOTATION_TYPE:注解类型声明
PACKAGE:包的声明
4.2、@Retention注解,翻译为持久力、保持力。即用来修饰自定义注解的生命力。
注解的生命周期有三个阶段:1、Java源文件阶段;2、编译到class文件阶段;3、运行期阶段。
同样使用了RetentionPolicy枚举类型定义了三个阶段:
SOURCE:注解将被编译器忽略掉
CLASS:注解将被编译器记录在class文件中,但在运行时不会被虚拟机保留,这是一个默认的行为
RUNTIME:注解将被编译器记录在class文件中,而且在运行时会被虚拟机保留,因此它们能通过反射被读取到
4.3、@Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中。
5、创建自定义注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestAnnotation {
}
6、创建AOP切面类
@Aspect //定义切面类的时候需要打上这个注解
@Component
public class TestAspect {
/**
* 定义切点:@annotation(com.always.annotation.TestAnnotation)
*/
@Pointcut(value = "@annotation(com.always.annotation.TestAnnotation)")
public void pointcutTest(){
}
/**
* 根据切点织入功能
* @param proceedingJoinPoint
*/
@Around(value = "pointcutTest()")
public Object aroundTest(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
Object object = proceedingJoinPoint.proceed();
System.out.println("根据自定义注解,织入了AOP方法!");
return object;
}
}
7、在测试方法上加自定义注解@TestAnnotation
// 自定义注解
@TestAnnotation
@ResponseBody
@PostMapping(value = "queryList")
public String queryList(@RequestBody Finance finance){
// 业务代码
return null;
}
调用方法,控制台打印了AOP方法的输出内容: