众所周知,spring声明式事务是基于AOP实现的,那么,若是咱们在同一个方法自定义多个AOP,咱们如何指定他们的执行顺序呢?网上不少答案都是指定order,order越小越是最早执行,这种也不能算是错,但有些片面。html
咱们在同一个方法上加如下两个AOP,看看究竟。java
[java] view plain copyspring
[java] view plain copyexpress
[java] view plain copy编程
看看执行结果:app
从上面的测试咱们看到,确实是order越小越是最早执行,但更重要的是最早执行的最后结束。ide
这个不难理解,spring AOP就是面向切面编程,什么是切面,画一个图来理解下:测试
由此得出:spring aop就是一个同心圆,要执行的方法为圆心,最外层的order最小。从最外层按照AOP一、AOP2的顺序依次执行doAround方法,doBefore方法。而后执行method方法,最后按照AOP二、AOP1的顺序依次执行doAfter、doAfterReturn方法。也就是说对多个AOP来讲,先before的,必定后after。ui
若是咱们要在同一个方法事务提交后执行本身的AOP,那么把事务的AOP order设置为2,本身的AOP order设置为1,而后在doAfterReturn里边处理本身的业务逻辑。spa