循环依赖概念:
多个bean之间相互依赖,产生了闭环,比如A依赖B,B依赖A,这就是循环依赖。
![在这里插入图片描述](https://img-blog.csdnimg.cn/7e749b09fdab45aca14776be8df369b7.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1J1bm5pbmdfbGVtb24=,size_16,color_FFFFFF,t_70)
三级缓存概念:
名称: | 概念: |
---|
一级缓存: | singletonObjects:存放完整的bean对象 |
二级缓存: | earlySingletonObjects:存放半成品对象 |
三级缓存: | singletonFactories:存放对象的Lambda表达式 |
解决流程:
|
---|
第一步:Spring开始初始化对象A,先实例化对象A,调用 getBean方法和doGetBean方法查询缓存中是否存在对象A,若无,则调用createBean方法和doCreateBean方法创建对象A,然后调用createBeanInstance方法将实例化的对象A添加到三级缓存singletonFactories中(防止后续循环依赖); |
第二步:调用populateBean方法,对象A注入属性;此时发现对象A依赖对象B,调用 getBean方法和doGetBean方法查询缓存中是否存在对象B,若无则开始初始化对象B,则调用createBean方法和doCreateBean方法创建对象B,然后调用createBeanInstance方法将实例化的对象B添加到三级缓存singletonFactories中(防止后续循环依赖); |
第三步:调用populateBean方法,对象B注入属性;此时发现对象B依赖对象A,调用 getBean方法和doGetBean方法查询缓存中是否存在对象A,发现在singletonFactories存在对象A,则将对象A从singletonFactories放入到earlySingletonObjects,然后完成对象B的注入,将对象B从singletonFactories放入到singletonObjects; |
第四步:完成对象B的注入后,继续对象A的注入,调用 getBean方法和doGetBean方法查询缓存中是否存在对象B,发现在singletonObjects存在对象B,则完成对象A的注入,将对象A从earlySingletonObjects放入到singletonObjects; |