方法级别的弹簧注释建议顺序

时间:2019-09-17 13:30:51

标签: spring aop

我创建了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");
    }
    }
    }
    }

1 个答案:

答案 0 :(得分:0)

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

  

咨询订购

     

当多条建议都希望在同一连接点上运行时会发生什么? Spring AOP遵循与AspectJ相同的优先级规则来确定建议执行的顺序。优先级最高的建议首先“在途中”运行(因此,给定两条优先建议,则优先级最高的建议首先运行)。从连接点“出路”时,优先级最高的建议将最后运行(因此,给定两条后续建议,优先级最高的建议将排名第二)。

     

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

     

当在同一方面定义的两条建议都需要在同一连接点上运行时,其顺序是不确定的(因为无法通过反射来获取javac编译类的声明顺序)。考虑将这些建议方法折叠为每个方面类中每个连接点的一个建议方法,或将建议重构为单独的方面类,您可以在方面级别进行订购。

我认为您最感兴趣的是最后一段。