注解按生命周期来划分可分为3类:
1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
那怎么来选择合适的注解生命周期呢?
首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解;如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,则可选用 SOURCE 注解。
创建切面包,创建自定义注解,提供记录核心方法的信息
加上@Retention注解,生命周期选择Runtime,运行时存在
Service层中的实现类,类中有核心方法。加上自定义的注解,括号内写(“登录操作”),“登录操作”:就是核心方法的信息
创建方法
public Object aroundMethod(ProceedingJoinPoint pjp){
}
方法加上@Around注解,括号内存注解:@annotation(自定义的注解的全限定名)
//在带这个自定义注解的核心方法,前后执行aroundMethod()
@Around的作用
1.既可以在目标方法之前织入增强动作,也可以在执行目标方法之后织入增强动作;
2.可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标目标方法的执行;
3.可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值; 当需要改变目标方法的返回值时,只能使用Around方法;