我有两个Spring方面(我们称它们为Aspect1和Aspect2)。在Aspect2之前执行Aspect1,Aspect1是日志记录方面,Aspect2是身份验证方面,这可能会使用ProceedingJoinPoint.proceed(modifiedArgs)
更新一个方法参数的值(如果通过身份验证,基本上将构造CustomAuthentication
对象)。为了进行记录,我需要在Aspect1中获取更新的参数(更新之前的CustomAuthentication
对象是null
,更新后它将包含我需要的一些实际数据),我希望@AfterReturn
建议可以完成工作,却没有,所以我有什么办法可以使它正常工作,还是完全不可能?
编辑1:我应该说过Aspect1的顺序比Aspect2低
最佳答案
您的Aspect2应该在Aspect1之前工作,因此您需要定义各方面的顺序。
从春季docs开始:
当在不同方面定义的两条建议都需要在同一连接点上运行时,除非另行指定,否则执行顺序是不确定的。您可以通过指定优先级来控制执行顺序。通过在Aspect类中实现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;
}
...
}