我有两个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;
    }
    ...
}

08-04 09:29