【问题标题】:spring annotation advice order on method level方法级别的弹簧注释建议顺序
【发布时间】:2019-09-17 13:30:51
【问题描述】:

我创建了 2 个自定义弹簧 @annotations。我需要在方法级别而不是类级别定义这些注释的顺序。 @order 是否也适用于方法级别?

 @Aspect
    @Component
    public class ABC {
        private ThreadLocal<logDTO> myThreadLocal;

        @Before("@annotation(CommunicationLogInit)")
        public void CampaignLogsInit(){
            myThreadLocal = new ThreadLocal<logDTO>();
            myThreadLocal.set(new logDTO());
        }


        @Around("@annotation(CommunicationAudit)")
        public Object generateLog(ProceedingJoinPoint joinPoint) throws Throwable { 
            MethodSignature signature = (MethodSignature)joinPoint.getSignature();
            Method method = signature.getMethod();
            int counter = 0;
            for(Parameter parameter : method.getParameters()){
                Annotation eventName = parameter.getAnnotation(EventName.class);
                Annotation rtnInfo = parameter.getAnnotation(RtnInfo.class);
                if(eventName!=null){
                    System.out.println(joinPoint.getArgs()[counter]);
    myThreadLocal.get().setName("ABC");
    }
    }
    }
    }

【问题讨论】:

  • 你能显示你的自定义注释代码吗
  • 欢迎来到 SO。如果您了解MCVE 是什么,然后将您的问题变成一个问题,那就太好了。否则人们不得不猜测你在问什么。所以让我猜猜:您的方面确实有效,两种建议方法都被触发,但不是按照您喜欢的顺序?你想知道你是否可以使用@Order

标签: spring aop


【解决方案1】:

Spring AOP 手册在advice ordering 部分回答了您的问题:

建议订购

当多条建议都想在同一个连接点运行时会发生什么? Spring AOP 遵循与 AspectJ 相同的优先级规则来确定通知执行的顺序。最高优先级的建议首先运行在“进入的路上”(因此,给定两条之前的建议,优先级最高的一条首先运行)。从连接点“退出”时,优先级最高的通知最后运行(因此,给定两条后通知,优先级最高的一条将运行在第二条)。

当在不同方面定义的两条通知都需要在同一个连接点运行时,除非您另外指定,否则执行顺序是未定义的。您可以通过指定优先级来控制执行顺序。这可以通过在方面类中实现org.springframework.core.Ordered 接口或使用Order 注释对其进行注释以正常的Spring 方式完成。给定两个方面,从Ordered.getValue()(或注释值)返回较低值的方面具有较高的优先级。

当定义在同一方面的两条通知都需要在同一连接点运行时,顺序是不确定的(因为无法通过反射来检索 javac 编译类的声明顺序)。考虑将这些建议方法合并为每个方面类中的每个连接点的一个建议方法,或者将建议部分重构为单独的方面类,您可以在方面级别对其进行排序。

我认为你对最后一段特别感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多