# 《Spring核心技术》第26章:深度解析调用通知方法的流程

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-22 (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~


  • 本章难度:★★★★☆

  • 本章重点:从源码级别彻底理解Spring底层调用通知方法的执行流程。

本章目录如下所示:

  • 学习指引
  • 通知顺序
  • 源码时序图
  • 源码解析
  • 总结
  • 思考
  • VIP服务

# 一、学习指引

Spring调用通知方法的流程,你真的彻底了解过吗?

在前面的文章中,深度解析了Spring构建AOP拦截器的执行流程,通过创建Bean构建增强器链和初始化Bean之后执行后置处理器构建拦截器链两个流程的分析,构建的拦截器链最终会存入AdvisedSupport类中的ArrayList类型的成员变量advisors中。后续在调用方法执行AOP切面通知方法时,就会执行拦截器链中的拦截器,按照一定的顺序执行AOP通知方法。

# 二、通知顺序

通知方法的执行顺序,你了解过吗?

不同的Spring版本的通知顺序是不同的,这里,主要给出Spring4与Spring5和Spring6之间的差异。

调用顺序 Spring4 Spring5 Spring6
1 @Around环绕通知之前 @Around环绕通知之前 @Around环绕通知之前
2 @Before前置通知 @Before前置通知 @Before前置通知
3 @Around环绕通知之后 @AfterReturning/@AfterThrowing @AfterReturning/@AfterThrowing
4 @After后置通知 @After后置通知 @After后置通知
5 @AfterReturning/@AfterThrowing @Around环绕通知之后 @Around环绕通知之后

可以看到,Spring4与Spring5和Spring6的执行顺序是不同的。

(1)Spring4中@After在@AfterReturning/@AfterThrowing的前面,并且@Around会将@Before包裹起来。

(2)Spring5和Spring6中@After在@AfterReturning/@AfterThrowing的后面,并且@Around会将@Before、@AfterReturning/@AfterThrowing和@After包裹起来。

# 三、源码时序图

结合时序图理解源码会事半功倍,你觉得呢?

本节,就详细分析下Spring底层调用通知方法的源码时序图。Spring底层调用通知方法的源码时序图如图26-1~26-2所示。

图26-1

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码