Spring AOP切面的执行顺序

博客探讨了Spring AOP中order属性对于切面执行顺序的影响。内容指出,order值越小的切面确实会先执行,但在同一切入点存在前切与后切的情况下,执行顺序是前切面先于后切面。通过对示例配置的分析,展示了在同一个方法上定义的不同before和after拦截器的实际执行顺序,并得出结论:order的优先级是相对于所有切面而言,而不仅仅是前切或后切。文章还引用了一个比喻,将Spring AOP比作同心圆,被拦截的方法位于圆心,order值决定了切面环绕的层级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         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显示执行顺序如下:

                                   


总结:

  1.  oder的优先级顺序针对切面和切入方法来说是越小越先执行。
     
  2. spring aop就是一个同心圆,要执行的方法为圆心,最外层的order最小。
    参考:https://blog.csdn.net/hxpjava1/article/details/55504513

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值