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 的区别。

参考

Spring中@within与@target的一些区别

posted @ 2026-04-01 22:57  strongmore  阅读(0)  评论(0)    收藏  举报