1、问题:什么叫循环依赖
Bean A 中引用 Bean B
Bean B 中应用Bean A
bean A实例化后会对Bean B属性赋值,发现B并不是完整的Bean,就会对Bean B进行生命周期一系列 *** 作,到了属性赋值的时候 ,发现A也不是完整的Bean,就会形成闭环,循环依赖。
2、答案:实际上spring内部解决了循环依赖,使用的是缓存机制解决的。
3、众所周知,形成循环依赖,就是没有闭环出口导致的,那么添加一个出口就可以解决这个问题,而这个出口就是spring的缓存机制。
4、 一级缓存:存放完整的Bean
二级缓存:避免多重依赖的情况下,重复创建动态代理(存放动态代理)
三级缓存:
a、存放的是函数接口 通过lambda把方法传进去(把bean的实例和bean的名字传进去,aop创建)
b、不会立即调用(如果在实例化后立即调用的话,所有的aop 不管bean是否循环依赖都会在实例化后创建 proxy,正常的bean,其实spring还是希望遵循生命周期在初始化创建动态代理)
c、会在ABA(第二次getBean(A)),才会调用三级缓存(如果实现了aop,才去创建动态代理,如果没有实现依然返回bean的实例)
d、放入二级缓存,避免重复创建动态代理。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)