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

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


1、图例说明:
在这里插入图片描述
2、AOP实现原理(CGLIB模式):

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

在这里插入图片描述

里面这个拦截链的部分其实还挺耐人寻味,竟然以这种方式模拟出了一种递归的感觉,害我又忍不住重新思考了半天……最后强迫自己画了一幅调用关系图:
在这里插入图片描述

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值