00:00
好,同学们,我们继续这块,请大家再跟着杨哥辛苦一下。杨格桑板斧理论实操小总结那么通过前面的学习我们已经明白了spring循环依赖它是什么,是一种什么样的一种故障现象,那么在储存容器当中为什么会有这个,它靠三级缓存怎么来解决的?那么这一切需要我们透过源码来进行debug分析,那么完成了前面的理论知识的储备,那么接下来我们来开始尝试一下,看一下spring的底层源码,并把3G缓存通过debug的形式啊给大家完整的阐述,为了给大家呢后面呢避免呢反复的切换,我先把这张图抓好。一级二级三级,最后混一次眼熟。只要是看map叫这个名字的是一级,Earlier的二级,这个object factory是三级,好,那下面开始第八个。
01:00
看一下AB2个对象在三级缓存过程当中的迁移是怎么完成的,那么首先啊,同学们,我们呢,回到我们自己的这个程序。那接下来。在容器里面有AB2个对象,那接下来呢,我们这儿啊。开始打断点。在打断点之前的时候,那么同学们我们先运行一次啊,来,大家请看目前是不是A跟B都可以打印出来,说明程序运行是OK的。在这块。不写默认就是single,单立的写不写都行,那么现在就是A里面有个BB里面需要有个A,现在spring没有报错,说明底层它靠三级缓存解决了循环依赖这个问题,那么它是怎么做到的,走起。下面程序呢,运行成功了。OK,那我这个断点打在哪呢?假设我先打在这儿,那么我一步一步的带着大家,给大家说明白怎么打断点,为什么打在这儿,我们先运行一次试试啊。
02:05
第八个我们打到这儿行不行。程序肯定会停在这儿,没有往下走。但是告诉我是不是后台已经打出来了我们的AB创建成功的信息了,说明这个断点在之前就已经执行完了,不能打在这儿,我们要打在这一行的上面,要保证你没有运行到这儿,我们就要看看它内部的底层和变化,所以说呢,同学们,我们给他放行通过OK吧,那么下面。我们呢,再来一次新的,也就是说你以后打。相关的框架级别的源码断点,就看他的日志啊,如果你写的日志已经打出来了,那么肯定说明什么,你断点打晚了就给往前移,打早一点,好,我们再来一次啊。大家请看,停在这儿。O,不OK,这就是系统提示出来的,无所谓说明什么,AB创建成功的那两句话有没有打印出来,没有说明我们卡位卡在这儿很准确,那接下来啊,先说一下这一段,你作为今天的家庭作业,回去一定要自己亲自答一下,非常的难。
03:09
包括我本人在备课期间,打着打着我自己都打飞了,这个不奇怪,同学们千万不要说,哎呀,怎么又找不到断点了,就放弃了,练一下好吗?好,那么这开始之前我们先复习一下。这个呢是找光标听懂了吧,比如说我现在啊,当前debug行是在第14行,但是我的光标假设哈,后面各种去看的时候已经移到别处了,我想迅速两个合并归老那么。点一下是不是,你看光标跟debug行就合并了,这个是,不过step by step1步一步的过往下走,这个叫。Step into,步入。能跟上,那就这就这个意思啊。一个叫不过。OK,一个呢,叫步入。
04:00
没问题吧,这个呢叫部弱,没问题吧,这个叫叫强制部弱。OK,那这个呢,是不是跳出当前的方法呀,好了,那么最后一个是叫什么。跳出啊。好,那么同学们,我们继续跑到这以后这一行肯定看不出是什么东西。那么这儿我们往下走,你点这个点这个都可以。进来。那么大家请看,是一个static静态代码块,它来加载这个类的名字肯定跟我们不相关,不需要这段我们给我干嘛跳出去。再回到这一行,我们再进去,诶,发现这儿有一个this,那么这个时候是不是相当于构造方法没问题吧,那么还是我们原来这个class pass X application相关的内容,那么再点进来进去好,那么现在一步一步的找下面super这个类。
05:00
走起。走起。走起,Refresh。在spring容器里面,Refresh这个方法非常非常的重要,说白了,我们在测试程序里面调的这一行,其实底子啊,就是我们的refresh。在面试考官的时候,他会问你一个问题。知不知道spring容器里面的初始方法,这个fresh你谈谈啊,如果你一脸懵逼,说明你什么?根本没有打过spring源码的框架相关的断点,没有读过spring源码,那么所以说这提前说一下refresh方法,就是我们的加载容器初始化这种类似的方法好。144行打一个断点,这个时候同学们请看。走起。等它慢慢的运行成功,大家请看是不是后台就已经success成功了,所以呢,我们在14行作为入口,第二个断点就是我们的refresh,没问题吧,好,我们呢,直接将其放行通过,再来一次,一步一步的找啊,就这样细致耐心的答,那么现在呢,我们再第八个,那么同学们请看现在是不是就回到我们第14行。
06:10
走起,那么我们要干什么呢?下面就不用step step1步一步的走了,因为我们已经走过,直接点它。到我们的下一个断点直接过来,同学们请看是不是直接到refresh了,直接到我们的第144行,OK,现在这个类啊,我们的入口是这个我们写的client这个类,然后呢。容器的初始化,各种病的加载,就是从鱼竿到里面的AB这两条鱼,这两个病,那么现在跑到了这儿。Refresh,干嘛再过,是不是就往下走?完成,那么所以说我们要看看这个方法往前进去,好的,那么往前进去了以后,那么同学们注意他们的快捷键不过是F6,这个时候是进入是F5,那么好同学们我的妈呀,那么点开你看看有这么多个。
07:03
这么长一篇,怎么看到底打在哪个方法上面,那么这个时候我教你同学们注意。现在后台是不是控制台是干干净净的,那么我们就一步一步。往下走OK,那么我们呢,走起现在呢,我们呢直接一步一步往下走,没问题吧,你点这个也可以,你看后台现在有没有东西啊。过了这个方法以后有没有。好,有这么一行,但没有打出我们的create a和B乘高,那么你看开始refresh这个方法,那么开始是不是刷新和加载这个容器了?要开始造鱼缸了,那么走起,我们呢,也把它删掉啊。后台还是给他清空,那么现在我们一步一步的走,同学们。下一步。再来看后台打出来了吧,请看。Factor提前准备的话,就是开始加载两个,并DeFinitions能跟上,那么AB这两个相当于说要从这个配置文件里面开始被读进去了,那么好,我们继续往下走,一步一步的step by step,那么这我还是先给它清空,你看啊,现在是不是还是空的,那么走吧。
08:15
打。带走带走带走,你看说明什么,这些东西都没有出现。后台都没有打印出我们自己写的这两句话。就是。OK,没有打印出这两句话说明什么,还没有触发,不应该把断点停留在这儿,那么下面我们继续往下,往下,往下你看又走了几步,看看后台怎么样,是不是还是干净的,那么这个时候。再往下,同学们不用多废话了,现在是不是只剩下最后一行叫finish refresh OK吧,那么。停在这儿,同学们请看,一搁到这儿了以后,唰唰后面就打出来了,所以说我们找到了我们的第三个落脚点,这一波同学们能跟上,你看又回来了吧,对吧,我们来我们来给它放行,所以说我们现在就知道了。
09:09
打这个断点啊,刚才应该是到第三个断点,554行,杨哥就带着你这样一步一步的推出来,让你学会读spring框架的源码的断点。读源码才是真真正正掌内功的好,那么下面呢,甭着急,一步一步来,这个非常容易出错,也非常需要你有极强的毅力和耐心,希望你不要觉得枯燥,如果你连这点苦都不能吃啊,我觉得什么?月薪25000,年薪30万以上的阿里P6,甚至年薪百万的P7,我觉得你也不要多想了,这个东西跟你没关系,OK,你能吃多大的苦就能成多大的事儿,走起,兄弟们继续。那么又回到我们这儿,一步一步来,怎么退出这些断点的,因为到最后你不要怕跟不上全部第八个断点我是不是都给你打好了,你照着参考就行了,那么来,同学们,我们继续。
10:02
再来一次第八个,你看是不是又到我们的初始的入口这一行了,那么现在就很明确很灵活了,第二个断点是哪个refresh OK,那么再来第三个断点是哪个,是不是我们的finish的这个,但是呢,它如果到这儿的时候,它已经打出来了,所以说我们呢。再在上面再打一个一步一步的来,这一波能跟上,OK,把它取消,我们的落脚点再调整,再重新换一下。那我们再来一次。现在入口程序。第二个点refresh。第三个断点卡在这儿,你看现在后台没有打印出AB创建成功的那两句提示语吧,请看是不是开始加载这两个B,从这个我们的资源文件content X XL里面开始造鱼了,那么OK,那么先从容器再到B,那么现在。第三个断点是他接下来应该干什么呀,是不是继续?
11:02
进去,那么好,同学们走起,那么这个就是finish b factory,你看b factory是不是要先完成容器的初始化,有鱼缸了你才能养鱼嘛,一步步来,那么接下来一步步走,这些不重要,我们过。过,在这儿过。来同学们又你看到873了,看后台有没有打出来没有,那么这个时候我们再往下。都起。再往下走起,你看到这儿了,第876行了,后台有没有打出东西没有,但是这个方法里面还剩第几行,最后一行说明879行。就是我们的第四个断点,你如果不相信,请看我这给他一放行,再往下走一行。好,再往下走一行,你看是不是就打印出来了,这波同学们能跟上,那么所以说我们现在就是879行,就是我们的第四个断点,你看一执行完了以后,刚才我们也进去看了一丢进去走过了,它马上打出来AB创建成功,这个意思啊,好,那么同学们我们呢,这个呢,就完成我们的第一步断点入口的寻找,就跟寻龙诀一样,慢慢的点点滴滴的往前走。
我来说两句