Java中的注解、元注解、切面概念

一、元注解
元注解就是注解的注解,可以在注解接口中使用的注解。
元注解友4个,分别是:@Retention、@Inherited、@Documented、@Target
下面我们一个一个详细了解一下这四个注解都是干什么用的?

@Retention(保留):注解保留的位置,
RetentionPolicy.SOURCE:注解仅存在于源码中,字节码文件中不存在了;
RetentionPolicy.CLASS:在字节码文件中存在,但运行时无法获得了(默认的保留策略);
RetentionPolicy.RUNTIME:在字节码文件中存在,在运行时也可以通过反射获取到。
当我们想要在程序运行的过程中知道用户请求的是哪个方法,需要的保留策略就是RUNTIME。
/**
 * 切面中需要定义切入点Pointcut,切入点就是我们要监控的方法或者类或者字段上面定义的我们的自定义的注解
 * 当调用方法的时候,发现上面有自定义的注解,那么就有了切入点,之后切面就起了作用,在方法执行之前或者方法执行之后,
 * 切面中的方法就要执行了。
 * 也就是说,我们自定义的切面和自定义注解是通过切入点关联在一起的,
 * 如果切面中没有定义切入点,那当方法执行的时候,尽管方法上又注解,也不会走切面中的方法。
 */

具体如何在切面中获取织入方法的方法名称、参数或者其他信息就需要通过api来获取了,根据需求使用不同的api来实现就行了。

@Inherited(继承):如果一个类使用了该注解,那么他的子类也使用了该注解。只要是父亲享受了注解的功能,那么他的后代也能享受。
@Documented:声明的注解能够被Javadoc识别到,添加进文档中。
@Target:注解作用的目标,
ElementType.TYPE:接口、类、枚举、注解
ElementType.FIELD:该注解添加到类的字段上
ElementType.METHOD:在方法上写注解
ElementType.PARAMETER:在方法参数上写注解
ElementType.CONSTRUCTOR:在构造函数上添注解
ElementType.LOCAL_VARIABLE:注解作用在局部变量
ElementType.PACKAGE:包上面加注解

使用小demo如下:

//@Target写在注解上面的注解,所以他就是元注解
//TestAnno的作用目标是方法上
//自定义注解中可以添加成员方法,并且可以为成员方法添上默认值。成员方法不能有参数
@Target(ElementType.METHOD)
public @interface TestAnno {
    //成员方法
    String methodTime();
    //成员方法,并有默认值
    String methodName() default "hello";
}

我们还可以通过在A类上添加注解之后,利用A类,通过反射机制,得到注解对象(注解是接口,就是实现注解接口后的对象,多态的机制),利用注解对象,得到该实例化注解的值。这里我理解的每次添加一个注解,就是创建了一个注解接口的对象,就实例化了一次,也就对注解中的方法赋值一次,所以可以通过反射拿到注解,拿到注解对象中的属性和方法值。
参考内容见:https://blog.csdn.net/bluuusea/article/details/79996572

二、AOP中的一些术语
之前用Springboot做了用户操作日志记录的功能,想到用AOP来实现。功能实现之后,整理项目的时候就想把AOP整理一下。Spring中最最核心的就是IOC和AOP了,刚接触的时候有点乱,慢慢用着用着就清晰了。IOC就是我们不用再自己手动以new的方式创建对象了,利用Spring来注入。AOP面向切面编程,有几个重要的点:
通知(Advice)。按照我的理解就是你到底想在什么时候加上你的功能,方法执行之前还是方法执行之后befor,after,around。
连接点(JoinPoint) 。每个我们想用自定义注解去注解的方法都看作是连接点,你可以在连接点上加注解也可以不加。
切入点(Pointcut)。在方法上加上注解,他就从连接点变成了你这个注解的切入点了。
切面(Aspect) 。具体实现的功能,但是需要指定切入点。在哪执行该功能,在这个之前还是之后(也就是通知)。
织入(weaving)。在具体类中使用切面的过程,并且实例化注解的时候就是织入。

你可能感兴趣的:(工作总结,工作总结)