如何更改由相同注释(如AspectJ中的@Around)注释的两个或多个建议的执行顺序?

时间:2018-08-31 08:36:01

标签: java spring annotations aspectj spring-aop

这是我的代码:

Navigator.push()

我知道了

@Pointcut("execution(* *(..))")
public void cutPointToken() {}

@Pointcut("execution(* *(..))")
public void cutPointEmptyParam() {}

@Around("cutPointToken()")
public Object authenticateToken(ProceedingJoinPoint joinPoint) throws Throwable {
    LOGGER.info("authenticate -- start --");
    ...
    Object o = joinPoint.proceed();
    LOGGER.info("authenticate -- end --");
    return o;
}

@Around("cutPointEmptyParam()")
public Object checkParameter(ProceedingJoinPoint joinPoint) throws Throwable {
    LOGGER.info("check param -- start --");
    ...
    Object o = joinPoint.proceed();
    LOGGER.info("check param -- end --");
    return o;
}

预期:

authenticate -- start --
check param -- start --
...
check param -- end --
authenticate -- end --

如何更改这两种方法的执行顺序?

尝试使用check param -- start -- authenticate -- start -- ... authenticate -- end -- check param -- end -- 批注,在@Order方法上使用@Order(1),在另一方法上使用checkParameter,但这不起作用。

1 个答案:

答案 0 :(得分:0)

使用@Order批注的想法是正确的,但是,根据文档7.2.4.7 Advice ordering的说明,将其放在类级别。

  

这可以通过实现org.springframework.core的正常Spring方式来完成。方面类中的有序接口或使用Order批注对其进行批注。

@Aspect注释的方法上的位置将不起作用,因为它没有注册为bean。在1.9.2. @Autowired部分中找到@Order注释。

  

@Order注释可以在目标类级别上声明,也可以在@Bean方法上声明...

@Aspect
@Order(1)
public class CheckParameterAspect {

    @Around("cutPointEmptyParam()")
    public Object checkParameter(ProceedingJoinPoint joinPoint) throws Throwable {
        //...
    }
}

@Aspect
@Order(2)
public class AuthenticateTokenAspect {

    @Around("cutPointToken()")
    public Object authenticateToken(ProceedingJoinPoint joinPoint) throws Throwable {
        //...
    }
}

编辑:从0开始排序似乎是可能的。