0

我有两个 Spring 方面(我们称它们为Aspect1Aspect2)。Aspect1在Aspect2之前执行,Aspect1是一个日志记录方面,Aspect2是一个身份验证方面,它可能会使用 更新一个方法参数的值ProceedingJoinPoint.proceed(modifiedArgs)(基本上,CustomAuthentication如果身份验证通过,则将构造一个对象)。出于记录目的,我需要在Aspect1中获取更新后的参数(CustomAuthentication更新前的对象是null,更新后它将包含我需要的一些实际数据),我祈祷@AfterReturn建议可以完成工作,但它没有,所以有有什么办法可以让它工作,还是完全不可能?

编辑 1:我应该说Aspect1的顺序低于Aspect2

4

1 回答 1

0

您的 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;
    }
    ...
}
于 2019-11-29T03:28:25.910 回答