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

Tra*_*chs 11 java aop spring spring-aop

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

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

@Around("@annotation(methodLevelX) || @within(classLevelX)")
public Object advise(ProceedingJoinPoint pjp, X methodLevelX, X classLevelX)
Run Code Online (Sandbox Code Playgroud)

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

@Around("@annotation(x) || @within(x)")
public Object advise(ProceedingJoinPoint pjp, X x)
Run Code Online (Sandbox Code Playgroud)

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

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

@Around("@annotation(com.package.X) || @within(com.package.X)")
Run Code Online (Sandbox Code Playgroud)

但我不愿意.

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

Nán*_*ete 19

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

@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();
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,除了拆分@annotation()@within()切入点之外,我还对生成的切入点添加了限制,以便它们不会过于宽泛.我想你想要方法执行连接点,所以我添加了所需的切入点表达式,将其限制为方法执行.他们匹配

  1. @X在第一个建议的任何包中的任何类中执行任何带有任何返回类型的方法
  2. @X在第二个注释的任何类中执行任何返回类型的方法.

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

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

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

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

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