我正在尝试让Aspectj拦截带注释的方法:
@Aspect
public class InterceptMeAspect {
@Around("execution(* *(..)) && within(@InterceptMe *)")
public Object doIntercept(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("intercepted:");
return proceedingJoinPoint.proceed();
}
}
public class InterceptedExample {
@InterceptMe
public void doSomething(){
}
}
为了简洁起见,我删除了!within(InterceptMeAspect),但是无论如何它并没有拦截太多。如果删除注释约束(在(@InterceptMe *)之内),它将起作用,但会拦截所有内容,并带来一个大问题。
输出字节码似乎具有完整的注释,因此我希望注释条件能够匹配。我正在或正在尝试进行编译时编织。这很重要,因为我还有另一个方面可以使用上面的相同方法来工作。我怀疑这方面已经弄乱了,但是最终的字节码不应该带有注释,对吗?
编辑: 这是另一方面的代码:
@Around(
"execution(protected * *(..)) && !within(com.walterjwhite.logging..*) && !call(*.new(..)) && within(@ContextualLoggable *) && !within(@NonLoggable *)")
我有一个通用的日志记录方面和一个特殊的上下文日志记录方面。我猜这也是写错了,应该遵循上面的格式。
答案 0 :(得分:1)
代替@Around("execution(* *(..)) && within(@InterceptMe *)")
。
应该是@Around("execution(* *(..)) && @annotation(your.package.InterceptMe )")
或者,如果您需要访问注释中的某些属性:
@Around("execution(* *(..)) && @annotation(interceptMeVar)")
public Object doIntercept(ProceedingJoinPoint proceedingJoinPoint,InterceptMe interceptMeVar)
答案 1 :(得分:0)
在使用自定义注释时,应使用@annotation而不是在内部:
@Aspect
public class InterceptMeAspect {
@Around("execution(* *(..)) && @annotation(com.or.org.package.InterceptMe)")