我有两个Spring方面(我们称它们为Aspect1和Aspect2(。Aspect1 在 Aspect2 之前执行,Aspect1 是日志记录方面,Aspect2是身份验证方面,可能会使用ProceedingJoinPoint.proceed(modifiedArgs)
更新一个方法参数的值(如果身份验证通过,基本上将构造一个CustomAuthentication
对象(。出于日志记录目的,我需要在Aspect1中获取更新的参数(更新前的CustomAuthentication
对象null
,更新后它将包含我需要的一些实际数据(,我祈祷@AfterReturn
建议可以完成这项工作,但它没有,那么有什么方法可以让它工作,还是完全不可能?
编辑1:我应该说Aspect1的顺序低于Aspect2
您的 Aspect2 应该在 Aspect1 之前工作,因此您需要定义您的方面的顺序。
来自春季文档:
当在不同方面定义的两条建议都需要在同一连接点运行时,除非您另行指定,否则执行顺序是未定义的。您可以通过指定优先级来控制执行顺序。这是通过实现方面类中的
org.springframework.core.Ordered
接口或使用@Order
注释来以正常的 Spring 方式完成的。给定两个方面,从 Ordered.getValue(((或注释值(返回较低值的方面具有较高的优先级。
所以第一个选项是添加@Order
注释:
@Aspect
@Order(0)
public class Aspect2 {
// your code
}
@Aspect
@Order(1)
public class Aspect1 {
// your code
}
第二个选项是添加接口:
@Aspect
public class Aspect2 implements Ordered
{
public int getOrder() {
return 0;
}
...
}
@Aspect
public class Aspect1 implements Ordered
{
public int getOrder() {
return 1;
}
...
}