Spring是如何解决单例Bean的循坏依赖?

什么是循环依赖呢?

循坏依赖就是Bean之间相互依赖,形成一个闭环。
如:BeanA依赖于BeanB,BeanB依赖于BeanA

Spring是如何解决的?
image.png
三级缓存
image.png

一级缓存:存放完整Bean
二级缓存:存放提前暴露出来的Bean,即还未进行属性注入的Bean
三级缓存:存放生成Bean的工厂

为什么说三级缓存存放的是生成Bean的工厂呢?
首先ObjectFactory是一个函数式接口


image.png

看下Spring是如何使用的:


image.png

image.png

这里getObject()实际调用的是createBean方法
在createBean()方法中将该Bean存到了三级缓存

addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
并且传入的参数是getEarlyBeanReference(beanName, mbd, bean)方法,这个方法主要是判断当前Bean是否需要创建代理对象,如果不需要则返回原本的Bean,需要则创建并替换改对象。

源码中的几个方法:
getSingleton:从缓存中获取Bean
doCreateBean:创建Bean
populateBean:属性填充
addSingleton:添加到缓存中

总结:
在创建Bean过程中Spring会先在一二三级缓存中查找是否存在该Bean,如果不存在才会去创建Bean,在实例化bean A之后将A存入三级缓存,再对bean A的属性B进行注入,如果不存在要注入的Bean B则会去创建,在创建过程中发现B也依赖了A,则会去缓存查找A,在三级缓存查找到A之后,会调用A的getObject方法,该方法实际是判断是否生成代理类,然后将A从三级缓存移到二级缓存,最后将半成品A注入到B中,随后完成B的实例化与初始化,最终将B注入到A属性中。

你可能感兴趣的:(Spring是如何解决单例Bean的循坏依赖?)