在切入点表达式中添加一些布尔条件

时间:2017-01-23 07:12:19

标签: aop aspectj spring-aop

我正在使用一些建议方法。我有控制器,服务和存储库的方法。

@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()切入点原语。

任何解决方法都将受到赞赏。 :)

1 个答案:

答案 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。:由于customAnnotationaudit之间的参数名称不匹配,您的示例代码可能无效。