怎么理解SpringAOP执行先后顺序实例
创始人
2024-12-24 21:03:14
0次

众所周知,spring声明式事务是基于AOP实现的,那么,如果我们在同一个方法自定义多个AOP,我们如何指定他们的执行顺序呢?

网上很多答案都是指定order,order越小越是最先执行,这种也不能算是错,但有些片面。

配置AOP执行顺序的三种方式:

通过实现org.springframework.core.Ordered接口

@Component @Aspect @Slf4j public class MessageQueueAopAspect1 implements Ordered{@Override   public int getOrder() {     // TODO Auto-generated method stub     return 2;   }    }

通过注解

@Component @Aspect @Slf4j @Order(1) public class MessageQueueAopAspect1{      ... }

通过配置文件配置

                     

我们在同一个方法上加以下两个AOP,看看究竟。

@Component @Aspect @Slf4j public class MessageQueueAopAspect1 implements Ordered{      @Resource(name="actionMessageProducer")   private IProducer actionProducer;        @Pointcut("@annotation(com.xxx.annotation.MessageQueueRequire1)")   private void pointCutMethod() {   }      //声明前置通知   @Before("pointCutMethod()")   public void doBefore(JoinPoint point) {     log.info("MessageQueueAopAspect1:doBefore");     return;   }    //声明后置通知   @AfterReturning(pointcut = "pointCutMethod()", returning = "returnValue")   public void doAfterReturning(JoinPoint point,Object returnValue) {     log.info("MessageQueueAopAspect1:doAfterReturning");   }    //声明例外通知   @AfterThrowing(pointcut = "pointCutMethod()", throwing = "e")   public void doAfterThrowing(Exception e) {     log.info("MessageQueueAopAspect1:doAfterThrowing");   }    //声明最终通知   @After("pointCutMethod()")   public void doAfter() {     log.info("MessageQueueAopAspect1:doAfter");   }    //声明环绕通知   @Around("pointCutMethod()")   public Object doAround(ProceedingJoinPoint pjp) throws Throwable {     log.info("MessageQueueAopAspect1:doAround-1");     Object obj = pjp.proceed();     log.info("MessageQueueAopAspect1:doAround-2");     return obj;   }      @Override   public int getOrder() {     return 1001;   } }

@Component @Aspect @Slf4j public class MessageQueueAopAspect2 implements Ordered{      @Resource(name="actionMessageProducer")   private IProducer actionProducer;        @Pointcut("@annotation(com.xxx.annotation.MessageQueueRequire2)")   private void pointCutMethod() {   }         //声明前置通知   @Before("pointCutMethod()")   public void doBefore(JoinPoint point) {     log.info("MessageQueueAopAspect2:doBefore");     return;   }    //声明后置通知   @AfterReturning(pointcut = "pointCutMethod()", returning = "returnValue")   public void doAfterReturning(JoinPoint point,Object returnValue) {     log.info("MessageQueueAopAspect2:doAfterReturning");   }    //声明例外通知   @AfterThrowing(pointcut = "pointCutMethod()", throwing = "e")   public void doAfterThrowing(Exception e) {     log.info("MessageQueueAopAspect2:doAfterThrowing");   }    //声明最终通知   @After("pointCutMethod()")   public void doAfter() {     log.info("MessageQueueAopAspect2:doAfter");   }    //声明环绕通知   @Around("pointCutMethod()")   public Object doAround(ProceedingJoinPoint pjp) throws Throwable {     log.info("MessageQueueAopAspect2:doAround-1");     Object obj = pjp.proceed();     log.info("MessageQueueAopAspect2:doAround-2");     return obj;   }      @Override   public int getOrder() {     return 1002;   } }

@Transactional(propagation=Propagation.REQUIRES_NEW) @MessageQueueRequire1 @MessageQueueRequire2 public PnrPaymentErrCode bidLoan(String id){        ...     }

看看执行结果:

从上面的测试我们看到,确实是order越小越是最先执行,但更重要的是最先执行的最后结束。

这个不难理解,Spring AOP就是面向切面编程,什么是切面,画一个图来理解下:

由此得出:spring aop就是一个同心圆,要执行的方法为圆心,最外层的order最小。从最外层按照AOP1、AOP2的顺序依次执行doAround方法,doBefore方法。然后执行method方法,最后按照AOP2、AOP1的顺序依次执行doAfter、doAfterReturn方法。也就是说对多个AOP来说,先before的,一定后after。

如果我们要在同一个方法事务提交后执行自己的AOP,那么把事务的AOP order设置为2,自己的AOP order设置为1,然后在doAfterReturn里边处理自己的业务逻辑。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...