# 《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所示。
# 查看完整文章
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码