这是我的代码:
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
,但这不起作用。
答案 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
开始排序似乎是可能的。