Spring源码DEBUG指南(2)——AOP实现原理(CGLIB模式)
- Spring源码DEBUG指南(1)——IOC容器启动及其组件初始化
- Spring源码DEBUG指南(2)——AOP实现原理(CGLIB模式)
- Spring源码DEBUG指南(3)——SpringMVC执行原理
本篇是AOP相关的源码分析,AspectJ和Transaction的都在里面,实际上实现原理是一样的,只不过用了不同的拦截器而已,图中都有说明。这里只画了CGLIB的实现,但其实JDK的也一样,无非就是创建动态代理对象的部分不同而已。
1、图例说明:
2、AOP实现原理(CGLIB模式):
- 当前源码版本:org.springframework:5.0.6.RELEASE
- 版本不同时代码的行号可能不同,但内容不受影响,如果使用其它版本调试时可忽略行号
- 图中的蓝色线条只表示静态依赖关系,不表示代码运行流程,将类的继承关系做到图中只是为了方便查看
- 点击可查看大图
里面这个拦截链的部分其实还挺耐人寻味,竟然以这种方式模拟出了一种递归的感觉,害我又忍不住重新思考了半天……最后强迫自己画了一幅调用关系图:
盯着图看了半天终于想明白了拦截链调用的本质:在A方法中调用B方法,在B方法中又调用了A方法,而每一次调用都伴随着相应的状态 (对应不同的调用链节点对象),在不断变化的状态中,最终会有一种状态能够终止这种调用关系(就像递归的中止条件一样),而这个状态所对应的表现形态其实就是index指到了链尾。
希望能够帮到正在与Spring源码做斗争的同学,如有不严谨之处还请多多指教。