AspectJ:一个方面内多个建议的执行顺序(优先级)



类使用编译时编织。

想象一下,我有方面类:

@Aspect
public class SecurityInterceptor {
    @Pointcut("within(@org.springframework.stereotype.Controller *)")
    public void beanAnnotatedWithController() {}
    @Pointcut("execution(public * *(..)) && args(*,httpReq)")
    public void publicMethods(HttpServletRequest httpReq) {}
    @Pointcut("beanAnnotatedWithController() && publicMethods(httpReq)")
    public void controllerMethods(HttpServletRequest httpReq) {}
    @Pointcut("execution(public * *(..)) && args(httpReq)")
    public void publicMethodsRequestOnly(HttpServletRequest httpReq) {}
    @Pointcut("beanAnnotatedWithController() && publicMethodsRequestOnly(httpReq)")
    public void controllerMethodsOneArg(HttpServletRequest httpReq) {}

    @Around(value = "controllerMethods(httpReq)")
    public Object populateSecurityContext(final ProceedingJoinPoint joinPoint, HttpServletRequest httpReq) throws Throwable {
        return popSecContext(joinPoint, httpReq);
    }
    @Around(value = "controllerMethodsOneArg(httpReq)")
    public Object populateSecurityContextOneArg(final ProceedingJoinPoint joinPoint, HttpServletRequest httpReq) throws Throwable {
        return popSecContext(joinPoint, httpReq);
    }
}

使用@DeclarePrecedence确定执行顺序的正确方法是什么?

请阅读AspectJ文档的语言语义部分中的"建议优先级"段落。

可以明确声明方面的优先级,单个方面的建议优先级由文档中描述的规则确定,不能更改,AFAIK。因此,在这种情况下,@DeclarePrecedence不会帮助您,只会更改方面文件中建议的顺序。

如果您正在寻找多个方面的顺序,则可以创建如下方面:

@Aspect
@DeclarePrecedence("AuthorizationAspect, MySpecialAspect, LastAspect")
public class CoordinationAspect {
    // empty
}

这确实可以在多个方面发挥作用。在一个方面内部是另一回事,无法改变 AFAIK,但我不明白为什么这会是一个问题。

当在同一方面定义的两条建议都需要在同一连接点上运行时,排序是未定义的(因为无法通过 javac 编译类的反射来检索声明顺序)。考虑将这些建议方法折叠为每个方面类中每个连接点的一个建议方法,或者将建议片段重构为单独的方面类 - 可以在方面级别排序。

来自此处的春季AOP文档(第6.2.4.7节。建议订购)https://docs.spring.io/spring/docs/2.0.x/reference/aop.html

如果你来这里寻找这个,它会有所帮助。

最新更新