【问题标题】:AspectJ: execution order (precedence) for multiple advice within one aspectAspectJ:一个方面内多个通知的执行顺序(优先级)
【发布时间】:2012-08-07 16:23:04
【问题描述】:

类使用编译时编织。

假设我有方面类:

@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确定执行顺序的正确方法是什么?

【问题讨论】:

    标签: java aop aspectj


    【解决方案1】:

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

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

    【讨论】:

    • 如果我们不能在单个方面更改通知的优先级,那么创建不同的方面然后对其进行排序会更好吗?
    • 正如我所说的那样,或者只是在单个方面更改建议的词汇顺序。
    【解决方案2】:

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

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

    这确实适用于多个方面。在单个方面是另一回事,无法更改 AFAIK,但我不明白为什么这会是一个问题。

    【讨论】:

    • 对不起,这个答案是错误的。原发帖人询问的是 one 方面的建议执行顺序,而不是方面间的优先级。
    • 嗯,答案本身并没有错。我知道最初的问题是关于一个方面的优先级,但我在回答中明确说明了这一点。
    • 我知道你做到了。我还可以正确解释如何在 Java 中实现 equals()hashCode(),但这并不意味着它在这种情况下是相关的。 :-) 无意冒犯。
    【解决方案3】:

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

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

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

    【讨论】:

    • OP 明确要求 AspectJ 的帮助,而不是 Spring AOP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多