基础概念
- @Target注解,是专门用来限定某个自定义注解能够被应用在哪些Java元素上面的,
public enum ElementType {
/* 类/接口 常用 */
TYPE,
/*属性 常用 */
FIELD,
/*方法 常用*/
METHOD,
/*方法形式参数声明*/
PARAMETER,
/*构造方法的声明*/
CONSTRUCTOR,
/*局部变量声明 */
LOCAL_VARIABLE,
/**/
ANNOTATION_TYPE,
/**/
PACKAGE,
/**/
TYPE_PARAMETER,
/**/
TYPE_USE
}
- @Retention注解,翻译为持久力、保持力。即用来修饰自定义注解的生命力。
注解的生命周期有三个阶段:1、Java源文件阶段;2、编译到class文件阶段;3、运行期阶段
public enum RetentionPolicy {
/**
Java源文件阶段
*/
SOURCE,
/**
编译到class文件阶段
*/
CLASS,
/**
运行期阶段
*/
RUNTIME
}
- @Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中
自定义一个注解
使用@interface定义注解,name未赋值则取default后面的默认值,
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RUNTIME)
@Documented
public @interface AnnotationForUs {
String name() default("AnnotationForUs,name默认值");
}
AOP拦截注解解析
编辑aop切面代码,得到自定义注解的值并输出控制台
@Aspect
@Component
public class AopForUs {
@Pointcut("@annotation(com.songhy.songhy_demo.service.AnnotationForUs)")
public void aopAndAnnotation() {
}
@Before("aopAndAnnotation()")
public void loginBefore(JoinPoint joinPoint) {
// 首先获取方法的签名,joinPoint中有相应的签名信息
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
// 通过方法的签名可以获取方法本身
Method method = signature.getMethod();
//判断是否存在自定义注解AnnotationForUs
boolean isExsit = method.isAnnotationPresent(AnnotationForUs.class);
if (!isExsit) return;
AnnotationForUs annotation = method.getAnnotation(AnnotationForUs.class);
//拿到注解的值,输出控制台
String name = annotation.name();
System.out.println("AnnotationForUs: "+name);
//todo 做特定操作
}
}
测试注解