00:00
来,同学们接下来呢,将会带带着大家。走一下spring循环依赖这道考题里面最难的一部分,通过前面的这个理论学习,弟兄们呢,应该知道了循环依赖到底是什么意思,理论上我们照着官网,从纯Java SE的代码到结合我们spring容器都给大家演示了,如果学到这儿,几乎等于hello word的级别,很粗浅的。那么下面这个问题就是循环依赖,主要就是三级缓存以及我们的对象。在死存容器里面的生命周期的变化,以及在缓存当中的移动情况,彻底要给大家演示清楚它底层是怎么跑的,那么这道题目如果你能回答的清楚。那么一定看过spring的源码,所以说这个时候请大家注意,难度非常难。大家跟着我。
01:00
现在呢,细细的看杨哥打底bug断点,跟你说清楚这个什么词部的,什么三级缓存到底怎么个工作运作的,那么要给他说明白,所以说呢,提前剧透这张不容易,但是请你坚持。很可能听完以后,你对idea的debug打断点,以及你对spring容器内部的架构将会有质的飞跃和提升。那么下面我们呢?在答第八个断点之前,还是先做一下理论知识的储备。甭着急,后面的最后总结都给大家整明白了,一张图带走,听懂了吧,那么你看有这么多步骤,你要给我把它整明白,非常的不容易,所以说我们要么就不做,要做就好好的把它打穿了,学透了,学真本事,那接下来呢?请跟着杨哥来老规矩,杨哥三板斧理论实操小总结,那么实操就是要第第八个spring的容器源码,那么在理论之前,我们先要明白一些小小的概念。
02:02
一个什么叫实例化?什么叫初始化?来。所谓实例化,你可以把它理解为就是六了,在内存里面溜了一会儿空空间租赁好房子,或者你买好了一个毛坯房了,现在自己的家具还没有装修呢,但是这个店你占住了,这个坑归你了。比方说两年以后这个房子才盖好,你先去买好了,那么两年以后这个房子起地基才起来,所以说这个时候是实例化,只是申请了一块内存空间,你还没有住进去呢。还没有搬进去呢,但这个坑是你的了,实例化完了以后干嘛叫初始化,开始进行属性填充,实例化和初始化是两个不同的意思啊,所谓的初始化,那么比方说你房子买好了,房子租好了,那么。这个房子里面你带准备带猫进去,还是带狗进去,怎么个装修,还是带只乌龟进去,那么这个时候是不是开始属性填充啊,所以说完成属性的各种赋值,装修,家电家具进场,把这个整明白了以后。
03:07
可以得出结论,这一行代码相当于说实例化。明白了吗?相当于说就是申请一块内存空间,我要准备放这个A,但是要放这个A,发现它有一个属性叫B,那么要往A里面是不是要填充我们的属性叫B啊,明白,A里面有个装修是BB,里面有个装修是A,那么spring内部通过容器。里面的三级缓存来解决循环依赖问题,再一次强调这必须是single time OK吧,好,只有是单立嘛,才可以复用,放到缓存里面才能被复用,才能解决循环依赖,好的,那么走起,兄弟们。那么在开始之前。明白了两个东道,这个就是毛坯房,这个就是初始化属性填充,有毛坯房以后装修。进场。第二个知识点,三个map,就是我们的那个三个缓存,OK和四大方法总体的相关对象的说明,那么再次强调。
04:10
所谓的三级缓存就是这个这个这个是三个map,但是基于我们这个版本啊,一个是看哈map,另外两个是哈map,他们的值KVKVKV也是不一样的,走起后续会说我们先提前混个眼熟。Single objects,那么兄弟们叫什么?一级缓存的引用名称?三个map,第二个叫single factor,那么这个呢,是我的。什么东东,是不是我们的三级缓存的名称,没问题吧,第三一个同学们请看,叫earlier提前暴露的,那么就是什么半成品,那这个时候就是我们的什么二级缓存,它是一个哈希map,好。
05:01
那么接下来呢,Spring在这些B的初始化加载的时候,它怎么玩的呢?里面有很多种方法,从左到右给大家总结出来,第一种叫get呢,Get。我要从spring容器里面得到这个单利病,有没有,有了在成品里面直接就拿出来,没有怎么办?没有是不是要创建,创建的过程当中populate并什么意思啊?是不是要对这个属性来进行填充,填充完了以后最终ADD single,把这个填充好的完整的对象,是不是把它从缓存里面挨个的逐步升级,从三级再到一,然后把它放到容器里面,说白了就是通过这三个互相倒腾。从没有。到创建,创建了以后进行属性的填充,填充完了以后再放回到容器里面,并且把它放到一级缓存里面,让它变成。产品对外暴露了以后提供服务给大家用,所以说呢,请注意。
06:02
这三级缓存我们呢,一层一层的过啊来。第一集叫single object,因为到后面bug啊,你现在就要一定要给我混眼熟,后面我会多次提及哪些是一级缓存,哪些是三级缓存,在这儿你不要去啰嗦和枯燥,背下来看看哈斯map就是什么一级缓存,到后面我带着你de bug,整个磁spring容器源码的时候,你就会明白了,那么这就是什么?单利对象的。缓存池啊,也叫单利池啊。表示已经经历了完整生命周期的并对象就是放成品的地方,OK吧?第二层叫二级缓存A里的这个,那么来同学们。他呢,早期的肝淋病对象的什么高速缓存病的实例,但是表示病的生命周期还没怎么着走完。只属于。半成品这个病是溜出来了,房子你买回来了,但是还没装修,听懂了吧,所以说就把这个病就这种情况下的,这种情况下的病就放在这个缓存里面,也就是说已经实例化了,但还没有完成初始化的病,就放在二级缓存好,那么三级缓存,那么就是我们的最后一个。
07:17
单利工厂的高速缓存叫。病的名称叫object factory,表示从犯生成病的工厂是三级缓存,就是说这个时候他放的是一个叫factory病。假如A要实现这个。OK,那么依赖。注入的时候,如果就不是一个A类,而是A类产生的一个B,好吗?那么相当于说要告诉你在工厂里面就要做这个,OK,下面呢,三个MAP4大方法,那么就是我们这张图非常重要。我去容器里面拿,如果有成品就直接使用,没有成品抱歉,说明容器里面还没有,就开始创建,创建的过程当中就要对它进行属性的填充,填充好了彻底造好了,再把它放回到spring容器里面,对外提供服务。
08:09
说的很简单,但是要把它从debug整明白还是要费点功夫好,那么最后AB2个对象在三级缓存中的迁移说明啊,它是会变动的,那么。来吧。第一步。A创建的过程中需要创建A的过程当中需要创建B,我们刚才已经说过了。创建A的过程当中,是不是需要创建B,听懂了吧,那么所以说它的过程是这样的,于是A呢,会先将自己放到三层三级缓存里面,就是说我们在工厂里面就要先整个A出来,然后A说了我这个里面需要有个实例。属性B没有怎么办,就要去实例化B,实例化的过程当中,他有发现我有需要A,于是B先在一级缓存中去查,就是成品的那个缓存里面查查有没有没有,再去查二级缓存有没有没有再去查上三级缓存有没有找到了,因为一开始是不是都先放到三级缓存里面,然后再把三级缓存里面这个A。
09:06
再放到二级缓存里面,并把三级缓存里面的这个A删掉,因为它从三升到了二级,你不能同一个对象分裂了,哪都有,你在三级的时候就不会在一级和二级挨个升级。这个时候,B初始化梳理完成了。将自己放到一级缓存里面,所以说B是不是就从三到一,但是这个时候B里面的A还在。二级缓存里面呢,它还是创建中的状态,还没有初始化完成,那么但是B已经彻底完了,这个时候我们再回来接着创建A,此时B已经创建结束。直接从。一级缓存里面拿B创建完成,并将A自己放到一级缓存里面,同时达到AB都创建完成的效果,这个就是它们的迁移顺序。好,那么这再来说一下,这个value叫object factory,它是个什么?
10:03
拉姆那个函数式接口可以用拉姆的表达式,那么它里面就是一个get b这么一个方法,相当于三级缓存,就是要get b,要拿到这个没有,那么我就通过工厂上去制造好,那么这个就是我们要准备debug spring容器源码的前提知识,最重要的就是这段文字。搬迁说明简化版的啊。第二个就是这张图,待会儿我们会反复回来。好,那么同学们在。Debug循环依赖的源码操作。程序实操之前,我们先把这些理论彻底说明白。
我来说两句