cglib的坎
自从开始看spring的源码以来,本身看的还可以,效率也挺高的,每隔两三天都有输出,但是最近这4/5天时间里,效率及其底下。
要总结一下,不然后续估计又要放弃。所以这篇随笔也是给自己打气,越是昏昏欲睡越是觉得无能为力越是长进的时候,千万不能泄气,咬牙坚持就能冲出重围。
开始看spring的bean结构的时候,遇到两个lookup 和 override的属性解析,在bean加载过程中,这两个属性牵扯到了cglib的处理,其实很好理解这里需要用cglib给类进行增强,来实现spring中lookup和override的属性实现。
因为之前对jdk的proxy研究过,但是对cglib并没有认真的查看,加之上次面试的时候有问到过cglib的问题,所以觉得这次需要把这个东西弄清楚,而且后续的aop部分,cglib是重点,因此决定把cglib的部分好好搞清楚,再继续。
所以策略上,这个进展是正常的,不要泄气。
但是具体操作上,现在遇到的问题是,查看cglib的时候,先查看了最初版本的源码,写了一篇博客,总结了下最初的版本,比较简单, 花了三个小时左右就弄明白了,代码也大概翻了下,输出了博客,确实是用继承的方式,实现了代码增强,添加了属性,实现一个factory的接口,创建新实例,同时实现原有类的接口方法,在增强过的方法中,调用前和调用后,有两个方法调用,就实现了代码增强下的cglib的核心。
于是前天15号,开始重新返回spring Bean部分代码的翻阅,虽然掌握了cglib的最初版本的核心内容,但是cglib的旧版本跟cglib的新版本还是有差别的,而spring的代码我看的是5.0的版本,显然用的是新版本的cglib的实现,所以考虑到这个,决定把新版本的cglib的原理一并掌握了输出,这样cglib的部分就基本研究透了。于是前天开始看cglib的新版本,但是这个过程中,出现了问题。首先cglib的新版本,看起来比较费劲,代码生成器从bcell换成了asm,而且复杂度较之最早版本差异还是不小的,加上开始没找对生成中间类的办法(最后知道是设置一个中间类生成地址的系统属性即可),前天开始看,看了一天无果,昨天又看,才在下午找到了这个属性,并且开始拿到生成的中间代码。
今天,上午看的时候,觉得需要把jdk的proxy和cglib的代码增强做一个比对,于是开始看jdk的proxy,jdk的proxy看的时候发现对jvm的原有opp_klass的对象模型比较欠缺,于是觉得要把这块儿也补上,于是又开始看这部分。
总之,现在梳理这篇博客,一是告诉自己,现在看的部分的意义,别忘了。二是告诉自己,只是遇到一个坎儿而已,不要灰心,其实jdk的proxy还有对象模型,之前都是看过的,只是之前就似懂非懂,才会造成现在的被动,所以这次更要弄明白弄清晰才行。