Spring源码DEBUG指南(2)——AOP实现原理(CGLIB模式)

本篇是AOP相关的源码分析,AspectJ和Transaction的都在里面,实际上实现原理是一样的,只不过用了不同的拦截器而已,图中都有说明。这里只画了CGLIB的实现,但其实JDK的也一样,无非就是创建动态代理对象的部分不同而已。


1、图例说明:
Spring源码DEBUG指南(2)——AOP实现原理(CGLIB模式)
2、AOP实现原理(CGLIB模式):

  • 当前源码版本:org.springframework:5.0.6.RELEASE
  • 版本不同时代码的行号可能不同,但内容不受影响,如果使用其它版本调试时可忽略行号
  • 图中的蓝色线条只表示静态依赖关系,不表示代码运行流程,将类的继承关系做到图中只是为了方便查看
  • 点击可查看大图

Spring源码DEBUG指南(2)——AOP实现原理(CGLIB模式)

里面这个拦截链的部分其实还挺耐人寻味,竟然以这种方式模拟出了一种递归的感觉,害我又忍不住重新思考了半天……最后强迫自己画了一幅调用关系图:
Spring源码DEBUG指南(2)——AOP实现原理(CGLIB模式)

盯着图看了半天终于想明白了拦截链调用的本质:在A方法中调用B方法,在B方法中又调用了A方法,而每一次调用都伴随着相应的状态 (对应不同的调用链节点对象),在不断变化的状态中,最终会有一种状态能够终止这种调用关系(就像递归的中止条件一样),而这个状态所对应的表现形态其实就是index指到了链尾。

希望能够帮到正在与Spring源码做斗争的同学,如有不严谨之处还请多多指教。