Spring配置当中可以指定一个order的值,网络大部分回答都是order值越小,越先执行,这样的说法相对于切面来说没问题,但感觉十分的片面,通常在我们的实际业务当中,一个method既有前切,又有后切,那么相对于我们整个业务流程来说的执行顺序又是怎么样呐?
- 这是在xml配置的对同一个切点的oder顺序
<aop:pointcut id="eu.digient.billfold.user.service.UserService.register"
expression=
"execution(* eu.digient.billfold.user.service.UserService.register(..))"/>
<aop:advisor pointcut-ref="eu.digient.billfold.user.service.UserService.register"
advice-ref="beforeInterceptorOne" order="1"/>
<aop:advisor pointcut-ref="eu.digient.billfold.user.service.UserService.register"
advice-ref="beforeInterceptorTwo" order="2"/>
<aop:advisor pointcut-ref="eu.digient.billfold.user.service.UserService.register"
advice-ref="afterInterceptorOne" order="1"/>
<aop:advisor pointcut-ref="eu.digient.billfold.user.service.UserService.register"
advice-ref="afterInterceptorTwo" order="2"/>
- beforeInterceptorOne
handleBeforeInterceptorOne(user) User user = (User) invocation.proceed()
- beforeInterceptorTwo
handleBeforeInterceptorTwo(user) User user = (User) invocation.proceed()
- afterInterceptorOne
User user = (User) invocation.proceed() handleAfterInterceptorOne(user)
- afterInterceptorTwo
User user = (User) invocation.proceed() handleAfterInterceptorTwo(user)
通过实际的运行程序,我们的trace显示执行顺序如下:
总结:
- oder的优先级顺序针对切面和切入方法来说是越小越先执行。
- spring aop就是一个同心圆,要执行的方法为圆心,最外层的order最小。
参考:https://blog.csdn.net/hxpjava1/article/details/55504513