带注释的类中带注释的方法或方法的切入点

我需要使用@X注释的类中的方法或使用@X注释的方法的切入点 。 我还需要注释对象 。 如果类和方法都被注释, 我更喜欢将方法注释作为参数

我尝试了以下操作,这会产生“不一致的绑定”警告。 (为什么不将它们设置为null?)

@Around("@annotation(methodLevelX) || @within(classLevelX)") public Object advise(ProceedingJoinPoint pjp, X methodLevelX, X classLevelX) 

以下内容创建了“参数(x)跨越’||’的模糊绑定 在切入点“警告。 (在我看来,这不一定有意义:为什么不绑定第一个短路评估?)

 @Around("@annotation(x) || @within(x)") public Object advise(ProceedingJoinPoint pjp, X x) 

如果存在类和方法注释,则将先前的尝试拆分为两个自然会导致两个方法调用。

我知道我可以通过这样的切入点获得带有reflection的方法和类以及我想要的注释:

 @Around("@annotation(com.package.X) || @within(com.package.X)") 

但我不愿意。

有没有“一个切入点,一个方法,一个注释参数”,我的要求的解决方案不需要反思?

不完全,但差不多。 您将需要两个切入点,两个建议,但您可以将工作委托给单个方法。 这是它的样子:

 @Aspect public 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()切入点之外,我还对结果切入点添加了限制,以便它们不会过于宽泛。 我想你想要方法执行连接点,所以我添加了所需的切入点表达式,将其限制为方法执行。 他们是匹配的

  1. 执行任何使用@X注释的方法,任何类中的任何返回类型都在第一个通知的任何包
  2. 在第二个@X注释的任何类中执行任何具有任何返回类型的方法

进一步限制@within(X)@annotation(X)会派上用场,因为@within(X)本身会匹配

任何连接点,其中关联代码在具有类型X的注释的类型中定义

其中包括方法执行方法调用构造函数执行构造函数调用预初始化静态初始化初始化字段集字段获取exception处理程序锁定类型连接点(并非所有连接点都有效)虽然建议 )。 同样, @annotation(X)本身就意味着

主题具有类型X的注释的任何连接点

这也可能意味着大多数前面提到的连接点,具体取决于注释的目标类型。