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

时间:2012-08-07 16:23:04

标签: java aop 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确定执行顺序的正确方法是什么?

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

请阅读AspectJ文档的language semantics部分中的段落“建议优先顺序”。

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

答案 2 :(得分:1)

  

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

来自Spring AOP文档( 6.2.4.7。建议订购https://docs.spring.io/spring/docs/2.0.x/reference/aop.html

如果你在这里寻找这个有帮助的话。