00:00
好,各位亲,我们继续那说了这个循环依赖了以后,那么前面强调过,你要说它的现象就这么回事,不管是三个也好,或者是两个也好,总之就是互相引用对方,我要实例化就需要对方,但是对方要等着你实例化,有点类似于卡死死锁这种现象,那么spring容器是怎么解决的呢?那么怎么引出这个故障给大家看呢?走起。首先。通过前面的官网介绍,我们已经知道了循环依赖现象,在磁通容器当中注入依赖的对象对吧?有两种,一个是构造注入,而且已经说过了构造注入创建一个无法解决的循环依赖的问题,如果你要用构造注入,那么这儿就要给把这句话就用代码给大家演示啊,就说构造注入是磁通容器当中的一种注入的方法,但是这种构造注入的方法对解决循环依赖不OK。听懂,你看unable听懂,但是呢,用set方法注入是可以的,所以说我们下面红色会报错,绿色可以通过,那么下面用最简单的代码来给大家演示我们节约时间构造器注入方式啊,因为什么构造方法这么写一个。
01:12
So easy,我就不再废话,那么直接看代码。为A为B,这是我们的测试类啊,Client,通过client就是测试类啊,严格习惯这么写,那么这个构造方法那么走起。我们第一种情况用构造注入啊,那么同学们请看一下。很简单吧,对于我们的A,我们呢,注入容器里面有个BA。这个B你怎么给它赋值啊?通过A的构造方法,我们节约时间,这点代码太简单了,听到我们就节约时间,不再手敲了,走起,因为。大家大厂班的同学是吧,这个不是重点。那么。如法炮制啊,举一反三,B这个东东里面有个属性是A。B的构造方法需要你注入A进来,然后完成A的复制。好,那接下来同学们请看一下,我们现在就需要你。
02:11
A跟B你都清楚了。很简单,是个怎么来的,B里面需要AA里面需要B,你懂的,这种情况会像什么,能不能溜出来,那么大家请看。比方说六啊,哎。可以吗?马上报错,为什么?因为这个构造方法不能为空。A里面是不是需要一个B好,那么再来service b好可不可以A里面需要B,我们就要把B传进去,那麻烦了。B里面也需要A,那么我再利用一个service a。我我认为不用写了吧,听懂这个意思吗?所以说像现在这种情况,根据官网所说这个演示啊,如果你一定要用构造方法的注入它,可能创建一个没有办法。跳不出圈的解决不了这个循环依赖的这么一个bug,因为你看大家请看是不是A里面要有B,那么再写一下是AB里面要A,是不是有点像我们的什么结论就是。
03:08
构造器循环依赖是无法解决的,你想让构造器注入循环赖不存在,我们当场验证了,官网上也说了,这种情况下,A里面套,BB里面套A里面套BB里面又套A,反反复复,反反复复,是不是有点像我们的俄罗斯套娃一样的,你解决不了这个明白,所以说我们第一种情况怎么着构造器方法注入?当场验证,如官网所说,没有办法解决,你要是还有任何怀疑,我们翻译一下。那么兄弟们对吧?如果你要使用构造函数注入的方法,则可能会创建无法解决的循环依赖的案例或者是方案,那么这个就告诉你,高到气的方式没有办法解决循环依赖。那么同学们,那么还是和官网。一样,那这个时候我们所说过了一种可能的解决方案是编译某些类的源代码,这些类的源代码由设置者而不是构造函数来解决,或者避免用构造方法而仅使用set注入。所以说构造注入无法解决循环,依赖set注入纯代码的来写是可以的,何以见得?同学们请跟着杨哥来。
04:17
下面我们走起啊,为了避免这些冲突。扣到AAA bbb set o吗?那么也提前写好,那么在这呢,啊,我们就知道了,构造方法是无法解决循环依赖的构造著作,那么下面第一个案例过第二个案例,那么大家请看,我们呢,也跟刚才一样,有AA有BB,那么同学们请看我们的AA。现在AA没有AA的构造。函数AA里面要有一个BB,要有这么一个属性,那么这个属性怎么给它赋值,通过set BB这个方法,那么请看这个是不是A里面设置了B,那么如法炮制一样,B是不是也没有bbb这样的一个构造方法,它里面有个属性AA,那么怎么给A注入,用S的方法注入,那么是不是B里面设置了一个A?好,那接下来啊,请看这个构造方法相当于说这个BA跟BA它们两个的构造方法,是不是就是默认的无差的那个构造方法。
05:18
他们两个只是A里面有BB里面有A,这个是可以的,就好比我们现在一个用户类里面有一个订单类,当然可以这样了,那么然后我们的测试类呢。很简单。先把A溜出来,再把B溜出来,然后再把B里面设置进去A里面设置进去BAOK吧,所以说你用,因为你new的时候,这个时候就已经完成了实例化和初始化,我们就调用了一个空的无参的构造方法听懂,那么这个时候AB都有了作为属性把它注进去,这是完全可以的,所以说用set可以解决这个问题,那么同学们请看B里面射进去AA里面射进去B,这个时候是完全没有任何问题的,那么从这我们可以。
06:01
验证了官网上所说的纯粹的普通的纯Java SE的代码,我们可以知道构造函数不可以解决循环依赖set,你看仅使用set注入可以解决循环依赖。好。那么这。我们呢,完火以后,那么接下来我们呢,就不再是纯粹的什么。Java SE的代码来给大家演示了,那么我们就要套上我们的spring容器这一波OK,好,下面我们就要用。结合我们的spring容器,把上面这个代码都弄上去,因为这道题目是不是叫spring的循环依赖,明白吗?那么加上容器以后,我们来看一下它的演示效果。
我来说两句