我需要使用@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)
如果存在类和方法注释,则将前一次尝试分成两个自然会导致两个方法调用。
我知道我可以通过这样的切入点获得带有反射和我想要的注释的方法和类:
@Around("@annotation(com.package.X) || @within(com.package.X)")
但我不愿意。
是否有任何"一个切入点,一个方法,一个注释参数",我的需求解决方案不需要反射?
答案 0 :(得分:18)
不完全,但差不多。您将需要两个切入点,两个建议,但您可以将工作委托给单个方法。这是它的样子:
@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
包括方法执行,方法调用,构造函数执行,构造函数调用, 预初始化,静态初始化,初始化,字段集,字段获取, 异常处理程序, lock 类型的连接点(并非所有连接点都对围绕建议有效)。同样,@annotation(X)
本身就意味着
主题的注释类型为
的任何连接点X
这也可能意味着前面提到的大多数连接点,具体取决于注释的目标类型。