00:00
好,各位同学,我们继续,那我把结论呢给大家呢,粘贴在笔记里面。也就是刚才我们所讲的,对于四和五。正常情况,异常情况,他们的a op的底层顺序是已经完全做了彻底的变更,请务必把握住好。那么对于spring a op的顺序这道题目,我们呢,就给大家介绍到这儿,接下来我们看一下。这个第四章的重点,Spring循环依赖。那走起吧,我们来再来预警一下,来看看这道题目。非常的恶心哈。首先。嗯,我们你们的学长去大厂面试了以后。这个题目呢,连续被问了两次了,所以说各位同学我们想进大厂哈,包括从小到大刷的那些题,做的那些。数理化的卷子都是为了去更好的平台,赛道不一样,环境不一样,必然导致人最后的收益是不一样,所以呢,为什么讲这些,并且要深度的讲,大厂考就这么简单好吧,所以说呢,简单粗暴,直接有效,想进大厂就要按照大厂的要求来打磨自己,想钓鱼就要去有鱼的地方,那么现在呢,学长考到了。
01:18
此外。很多录音呢,我也听过了。跟循环依赖相关的什么是spring中的三级缓存?三级缓存分别是些什么?三个map有什么一套?什么是循环依赖?你谈谈有没有看过spring的源码,一般我们说的容器指的是什么?如何检测是否存在循环依赖?实际开发中你有没有见过循环依赖出现过的异常等等等等诸如此类。那么所以说同学们,如果你现在去大厂面试啊,去美团,阿里呀,字节呀,京东啊。碰上这样的一个面试官,人家来一个题目,嗯,请你说说什么是spring循环依赖,那么同学们,咱们别说答了,如果你没有做过专业的准备和训练,可能你连题目都听不懂。
02:06
好了,那么同学们这个呢?比较困难。几乎呢,难度呢,比我们的GUUC上面的AQ是不遑多让,甚至更难,那么后续呢,也会对spring容器中的源码进行debug的深度讲解。请大家坚持,别的我就不多说了,走起。那么下面呢,我们来说一下什么是循环依赖,那么我先不展开同学们光从字面请大家思考,我暂停一下录屏,什么叫循环依赖?感谢各位同学的回复,那么接下来我们呢,往下翻。首先啊。最简单的来说,多个病之间相互依赖,形成了一个什么?闭环A依赖于BB,依赖于CC,依赖于A,咱们先说啊。从Java a线最朴素的代码这个层面来说一下这个现象。那么大家露眼。
03:07
我这有个class t。内部类里面要包含bab,要包含CC,要包含A,那么这个时候就是用代码级别最朴素的。依赖这样关系的展现,那么我们一般所说的循环依赖啊,主要是指在spring容器里面。如果说spring容器中,它内部又怎么解决循环依赖呢?一般啊,我们大家都知道,Spring容器呢,像一个鱼竿。里面有一些并工厂并对象磁喷容器里面有一些病,这些病就像鱼缸里面的一条条的鱼,一般是单立模式啊。那么对于spring容器当中各个病属性互相引用的场景就是AB里面有个bab里面有个A,它们两个互相引用对方即是在死分容器当中的一个类,又是在这个类当中的另外的类的一个属性那。
04:04
直接过来就这么简单,OKA里面作为一个组件注册进spring容器,但是要初始化并加载这个类的时候,需要有一个B,那么B又需要有个CC,又需要有个A么?这样属于ABC3个类互相引用,当然两个也可以啊,那么这个时候。你懂的,干嘛,是不是形成一个闭环,那么这个就是最朴素的循环依赖的现象,OK,那么所以说什么是循环依赖,咱们呢,先有个最简单的入门级别的感性的认识好,那么一说起这个循环依赖的话呢,我们就要不得不涉及到两种注入方式啊,对循环依赖的影响。那么大家都清楚啊,依赖注入是不是一种基于容器的框架,那么最经典的有很多种注入方法,对吧?最经典的是不是有构造注入方法,还有set注入方法,还包括那些注解等等,那么常用的是不是构造方法注入和set方式的注入啊,那接下来啊,那么请大家跟着走,我们需要对循环依赖的这个。
05:17
概念提出来。做一个深度的解读,莫名其妙的哪来这么一道题目,真有这样的一种现象,真有这样的一个知识点和考点吗?二话不说,咱们呢,循环依赖的理论出处来自于哪?Spring官网?那么走起同学们请看这是不是有个。循环依赖呀,那么他这儿对循环依赖有一个简单的说明,那么来同学们老规矩,凡技术必登官网,杨哥说过很多次了,那么带着大家来看一下。有机会呢的源码和官网哈,大家呢读一下,那么我们的版本呢,SPRING5以后听懂,那么找到我们的1.4依赖关系,那么大家请看。
06:01
这个是不是叫依赖注入,那么我们对于依赖注入是不是有构造方法,有基于构造方法的构造注入,基于set方法的set注入,那么大家请看。依赖解决的和推动的一些问题,那么接下来这儿就有我们的一个东东叫循环依赖,所以说这道题目来自哪的,来自于这儿,那么从润的源码和底层,它会出现一些什么问题呢?那么大家请看我们在这儿啊,读一下。那么这个时候它的意思说循环依赖,我们前面说过了啊,它有两种方法,作为磁盘容器的著作构造和set,提前说只允许用set。构造方法注入会出事,不是我说的啊,是官网上这说的,如果你一定要用构造方法注入它,可能会创造一个无法解决的循环依赖的这么一个问题,首先就开篇,第一跟你说构造方法注入对循环依赖支持度不友好,你想嘛,就是没讲构造方法是什么意思啊,比方说我尿。
07:07
Apple,一个苹果在六的过程当中调用这个构造方法,我需要注入其他的元素,但是其他元素还没有六出来呢。那么我现在。想做一道菜叫水煮鱼,什么都准备好了,就缺这条鱼,那么你告诉我这个时候是不是初始化加载就不OK啊,那么所以说呢,他这儿呢,给你说举个case啊,对于A假设要求一个B的实例要通过。构造方法注入的话,那么这个时候B也要求一个实例A要通过构造方法注入,那么就是我们前面所说的。A里面需要一个BB里面需要一个A,双方呢,都拿枪指着对方,你先把枪放下,你先把枪放下,你先把枪放下,你先把枪放下,都等着对方,这个条件永远不成立,所以说呢,如果你需要配置A跟B是通过这样的一种方法移知other的话呢,那么spring的IOC容器将会侦测。
08:01
发现这样的一种循环的引用在运行时的时候不成立,将会抛出一个并currently in creation exception,抛出这样的一个异常,OK,那么所以说有一种可能的解决方法就是。通过编辑这个某些类的源代码,然后通过配置set方法rather than啊是不是超过什么。构造方法注入听懂,所以说呢,我们呢,或者说啊,另外一种程度而言,避免构造构造注入方法只用set注入,你看only,所以说我们这儿就明白循环依赖对构造注入不友好,但是我们用set注入是可以的,所以说某种程度某种层次上而言,我们通过。变通的方法。来完成我们循环依赖的破解,也就是说你看啊,他呢并不推荐。某种角度而言,并不推荐你要用构造注入,你可以配置循环依赖,用set方法注入,OK吗?那么这个呢,是我们最简单的一个官网的解读,循环依赖这个题目来自于哪?就来自于这。
09:12
那么,老规矩三板斧理论实操小总结。我跟你讲的这些你不用怀疑,基本上都是官网上说的原话,那么接下来这个理论有了,那么要带着大家读一下spring的源码,那么比如说前面面试题啊,还会问你什么。三级缓存啊,什么叫三级缓存?Spring听着你都是懵逼的,那么所以说各位同学不要。怕麻烦先听理论,在面试官面试的时候没有谈资啊。这是不行的,面试官觉得你跟我过两招都下不来啊,所以说呢,希望大家呢,不要嫌这些理论枯燥,更不要在屏幕面前犯困,跟着听走起。得到结论就是我们AB啊,循环依赖的问题,只要A的注入方式是set,并且这个并是single单立的,当然我们都知道容器这个是不是都是默认的,那么就不会有循环依赖的问题,OK,也就是说spring它底层会给你解决循环依赖。
10:14
那么接下来我们要看看那么磁不能容器循环依赖报错,我们来给大家看一下循环依赖报错是一种什么样的故障现象。OK,好的,那么这一小节我们先把spring的理循环依赖这道题目。他的理论出处啊,官网的说明,先给大家做一个。正确的演示后续我们代码说话到实操部分,那么至于说什么三级缓存啊,那些我们在下一节再给大家进行详细的debug说明。
我来说两句