我正在使用一些建议方法。我有控制器,服务和存储库的方法。
@Around("execution(* com.abc..controller..*(..)) && @annotation(audit)")
public Object controllerAround(ProceedingJoinPoint proceedingJoinPoint, Audit audit) throws Throwable {
//some code here
return output;
}
@Around("execution(* com.abc..service.*Impl.*(..))")
public Object serviceAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//some code here
return output;
}
@Around("execution(* com.abc..persistence.*Impl.*(..))")
public Object persistenceAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//some code here
return output;
}
我有一个查询,我需要检查serviceAround方法切入点表达式,它是否来自controllerAround方法。我尝试使用一些标志,但spring不支持aspectj的if()切入点原语。
任何解决方法都将受到赞赏。 :)
答案 0 :(得分:2)
您实际需要的是cflow()
或cflowbelow()
,而不是if()
。但那些也是not supported by Spring AOP。因此,剩下的解决方案是通过LTW(加载时编织)在Spring中使用AspectJ的全部功能。如何做到这一点是nicely documented。
切入点看起来像这样:
execution(* com.abc..service.*Impl.*(..)) &&
cflow(
execution(* com.abc..controller..*(..)) &&
@annotation(customAnnotation)
)
或者更简单,假设您不需要在advice方法中使用注释:
execution(* com.abc..service.*Impl.*(..)) &&
cflow(execution(* com.abc..controller..*(..)))
注意: cflow()
仅适用于一个线程内的控制流,而不是*Impl*.(..)
在controller..*(..)
以外的另一个帖子中执行。
P.S。:由于customAnnotation
和audit
之间的参数名称不匹配,您的示例代码可能无效。