6

类使用编译时编织。

想象一下我有方面类:

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

4

3 回答 3

7

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

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

于 2012-08-31T17:04:00.353 回答
7

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

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

这确实会在多个方面起作用。在一个方面是另一回事,不能改变AFAIK,但我不明白为什么这会是一个问题。

于 2014-09-07T12:33:43.343 回答
0

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

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

如果它有助于你来这里寻找这个。

于 2018-04-03T11:26:26.550 回答