自定义注解及AOP切面的应用笔记
注解解释
@Target
用于描述注解的使用范围,有一个枚举ElementType来指定,具体如下:
CONSTRUCTOR:用于描述构造器
FIELD:用于描述域
LOCAL_VARIABLE:用于描述局部变量
METHOD:用于描述方法
PACKAGE:用于描述包
PARAMETER:用于描述参数
TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention
表示需要在什么级别保存该注释信息,用于描述注解的生命周期,也是一个枚举RetentionPoicy来决定的,一般都是填的RetentionPoicy.RUNTIME,填这个值注解处理器才能通过反射拿到注解信息,实现自己的语义
注解类
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test1 {
String key() default "" ;
}
注解应用
@Test1(key="6666666666666")
@RequestMapping("t")
public String test(@RequestParam Map map){
return "dddd";
}
切面解析应用
@Aspect //表明这个类是切面类
@Component //这个类交由Spring管理
public class TestAspect {
public TestAspect(){
System.out.println("-*--------------------------");
}
@Pointcut("@annotation(p.u.sys.annotation.Test1)")
public void logPointCut() {
System.out.println("-*--------------------------");
}
@Around("logPointCut()")
public Object object(ProceedingJoinPoint point) throws Throwable {
//获取拦截的方法名
Signature sig = point.getSignature();
MethodSignature msig = null;
if (!(sig instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只能用于方法");
}
msig = (MethodSignature) sig;
Object target = point.getTarget();
Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
String methodName = currentMethod.getName();
String className = point.getTarget().getClass().getName();
//获取拦截方法的参数
Object[] params = point.getArgs();
//获取操作名称
Test1 annotation = currentMethod.getAnnotation(Test1.class);
//注解值
String key = annotation.key();
return "";
}
}