AspectJ中的几种常用pointcut表达式
使用介绍
- execution(public * com.imooc..web...*(..)) 匹配哪些包下的哪些类的哪些方法
- @annotation(com.imooc.product.aspectj.TimeCost) 匹配方法上的注解
- @within(com.imooc.product.aspectj.TimeCost) 匹配调用方法所在的类上面的注解,就是这个方法是在哪个类上定义的
- @target(com.imooc.product.aspectj.TimeCost) 匹配调用方法运行时所属于的类上面的注解
如果父类和子类上都标有注解,@within和@target的所得到实际注解的区别
| @within | @target | |
|---|---|---|
| 父类方法 | 父类注解 | 父类注解 |
| 子类不重写方法 | 父类注解 | 子类注解 |
| 子类重写方法 | 子类注解 | 子类注解 |
@target 会导致所有bean都生成代理类,但是有些Bean类是final的不能代理,所以会导致项目启动报错。
@Around("requestServer()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Class<?> declaringClass = ((MethodSignature) proceedingJoinPoint.getSignature()).getMethod().getDeclaringClass();
System.out.println("declaringClass: " + declaringClass);
Class<?> targetClass = proceedingJoinPoint.getTarget().getClass();
System.out.println("targetClass: " + targetClass);
return proceedingJoinPoint.proceed();
}
此时declaringClass为父类, targetClass为子类(子类不重写方法的情况下)。
注意:proceedingJoinPoint.getThis 和 declaringClass 的区别。

浙公网安备 33010602011771号