带注释的类中带注释的方法或方法的切入点
我需要使用@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()
切入点之外,我还对结果切入点添加了限制,以便它们不会过于宽泛。 我想你想要方法执行连接点,所以我添加了所需的切入点表达式,将其限制为方法执行。 他们是匹配的
- 执行任何使用
@X
注释的方法,任何类中的任何返回类型都在第一个通知的任何包中 - 在第二个用
@X
注释的任何类中执行任何具有任何返回类型的方法 。
进一步限制@within(X)
和@annotation(X)
会派上用场,因为@within(X)
本身会匹配
任何连接点,其中关联代码在具有类型
X
的注释的类型中定义
其中包括方法执行 , 方法调用 , 构造函数执行 , 构造函数调用 , 预初始化 , 静态初始化 , 初始化 , 字段集 , 字段获取 , exception处理程序 , 锁定类型连接点(并非所有连接点都有效)虽然建议 )。 同样, @annotation(X)
本身就意味着
主题具有类型
X
的注释的任何连接点
这也可能意味着大多数前面提到的连接点,具体取决于注释的目标类型。