不完全是,但是差不多。您将需要两个切入点,两个建议,但是您可以将工作委托给一个方法。看起来像这样:
@Aspectpublic class AnyAspectName { @Pointcut("execution(@X * *.*(..))") void annotatedMethod() {} @Pointcut("execution(* (@X *).*(..))") void methodOfAnnotatedClass() {} @Around("annotatedMethod() && @annotation(methodLevelX)") public Object adviseAnnotatedMethods(ProceedingJoinPoint pjp, X methodLevelX) throws Throwable { return aroundImplementation(pjp, methodLevelX); } @Around("methodOfAnnotatedClass() && !annotatedMethod() && @within(classLevelX)") public Object adviseMethodsOfAnnotatedClass(ProceedingJoinPoint pjp, X classLevelX) throws Throwable { return aroundImplementation(pjp, classLevelX); } public Object aroundImplementation(ProceedingJoinPoint pjp, X annotation) throws Throwable { return pjp.proceed(); }}请注意,除了将
@annotation()和
@within()切入点分开之外,我还对结果切入点添加了限制,以使它们不会太宽。我想您想要 方法执行
连接点,所以我添加了所需的切入点表达式,将其限制为方法执行。他们是匹配的
@X
在第一个建议中 ,在任何包中的任何类中的任何类中以任何返回类型 注释的任何方法的执行- 在带有
@X
_第二个 _注释的任何类中具有返回类型的任何方法的执行 。
进一步的限制
@within(X)并
@annotation(X)派上用场,因为
@within(X)它本身会匹配
在类型中使用类型注释定义关联代码的任何连接点
X
其中包括 方法执行 , 方法调用 , 构造函数执行 , 构造函数调用 , 预初始化 , 静态初始化 , 初始化 , 字段集
, 字段get , 异常处理程序 , 锁 类型连接点(并非所有连接点都对 周围的建议 )。同样,
@annotation(X)本身意味着
主题具有类型注释的任何连接点
X
这也可能意味着前面提到的大多数连接点,具体取决于注释的目标类型。



