04. Spring Framework 循环依赖
2022-02-26 09:50:25 0 举报
AI智能生成
Spring 循环依赖
作者其他创作
大纲/内容
<div>getSingleton("<font color="#2196f3">dog</font>", true)</div><div>此时获取不到返回 null</div>
getSingleton("<font color="#2196f3">dog</font>", () -> createBean("<font color="#2196f3">dog</font>", mbd, args))<br><div></div>
beforeSingletonCreation("<font color="#2196f3">dog</font>")<br>添加到【singletonsCurrentlyInCreation】集合中<span style="font-size: inherit;">表示正在创建</span>
<div>singletonFactory.getObject()<br>通过上一步传入的匿名内部类创建 bean 对象</div>
createBean("<font color="#2196f3">dog</font>", mbd, args)<br><div>创建 bean 对象</div>
AbstractAutowireCapableBeanFactory.doCreateBean("<font color="#2196f3">dog</font>")<br><div>真正的创建对象方法</div>
<div><div>createBeanInstance("<font color="#2196f3">dog</font>", mbd, args)<br></div><div>使用构造方法创建 bean 实例<br>此时还未完成属性赋值、初始化方法等一系列操作,仅仅是通过反射实例化对象</div></div>
<div>addSingletonFactory("<font color="#2196f3">dog</font>", () -> getEarlyBeanReference("<font color="#2196f3">dog</font>", mbd, bean))<br></div><div>向三级缓存 【singletonFactories】存一份 ObjectFactory(() -> getEarlyBeanReference("<font color="#2196f3">dog</font>", mbd, bean))<br>从二级缓存 【earlySingletonObjects】移除</div>
populateBean("<font color="#2196f3">dog</font>")<div>给 bean 属性赋值,依赖【<font color="#9c27b0">person</font>】,所以需要会从容器中查找 person 完成属性赋值<br></div><div>此方法执行完毕后【<font color="#2196f3">dog</font>】对象所有属性会完成赋值操作</div>
AbstractBeanFactory.doGetBean("<font color="#9c27b0">person</font>")<br><div>从容器中获取 people 对象</div>
<div>getSingleton("<font color="#9c27b0">person</font>", true)</div><div>此时获取不到返回 null<br></div>
getSingleton("<font color="#9c27b0">person</font>", () -> createBean("<font color="#9c27b0">person</font>", mbd, args))<br>
beforeSingletonCreation("<font color="#9c27b0">person</font>")<br>添加到【singletonsCurrentlyInCreation】集合中<span style="font-size: inherit;">表示正在创建</span>
singletonFactory.getObject()<br>通过上一步传入的匿名内部类创建 bean 对象<br>
createBean("<font color="#9c27b0">person</font>", mbd, args)<br><div>创建 bean 对象</div>
AbstractAutowireCapableBeanFactory.doCreateBean("<font color="#9c27b0">person</font>")<br><div>真正的创建对象方法</div>
<div>createBeanInstance("<font color="#9c27b0">person</font>", mbd, args)<br></div><div>使用构造方法创建 bean 实例<br>此时还未完成属性赋值、初始化方法等一系列操作,仅仅是通过反射实例化对象</div>
<div>addSingletonFactory("<font color="#9c27b0">person</font>", () -> getEarlyBeanReference("<font color="#9c27b0">person</font>", mbd, bean))<br></div><div>向三级缓存 【singletonFactories】存一份 ObjectFactory(() -> getEarlyBeanReference("<font color="#9c27b0">person</font>", mbd, bean))<br>从二级缓存 【earlySingletonObjects】移除<br></div>
populateBean("<font color="#9c27b0">person</font>")<div>给 bean 属性赋值,依赖【<font color="#2196f3">dog</font>】,所以需要从容器中查找 dog 完成属性赋值</div><div>此方法执行完毕后【<font color="#9c27b0">person</font>】对象所有属性会完成赋值操作</div>
AbstractBeanFactory.doGetBean("<font color="#2196f3">dog</font>")<br><div>从容器中获取 dog 对象</div>
<div>getSingleton("<font color="#2196f3">dog</font>", true)</div><div>这里会返回利用三级缓存创建的 bean 对象<br></div>
getEarlyBeanReference("<font color="#2196f3">dog</font>", mbd, bean)<div>此时 bean 对象是之前创建出来的状态(<font color="#f44336">也有可能是 aop 代理对象,被 BeanPostProcessor 修改</font>)<br>属性并未赋值,因为<span style="font-size: inherit;">【populateBean】过程还未结束</span></div>
<div>getEarlyBeanReference()<br></div><div>调用【SmartInstantiationAwareBeanPostProcessor】的 getEarlyBeanReference() 方法</div>
<div>校验是否能从二级缓存【earlySingletonObjects】中获取到之前提前暴露的 bean 对象<br>如果可以获取到,需要与赋值后的 bean 对象进行比较<br>如果不是同一个对象则表明被 AOP 进行代理了这里就会抛出异常</div>
<div>getSingleton("<font color="#9c27b0">person</font>", false)</div><div>此时获取不到返回 null</div>
addSingleton("<font color="#9c27b0">person</font>", singletonObject)<br><div>向一级缓存【singletonFactories】添加 bean 对象</div>从三级缓存【singletonFactories】移除<br>从二级缓存【earlySingletonObjects】移除<br>
校验是否能从二级缓存【earlySingletonObjects】中获取到之前提前暴露的 bean 对象<br>如果可以获取到,需要与赋值后的 bean 对象进行比较<br>如果不是同一个对象则表明被 AOP 进行代理了这里就会抛出异常<br>
<div>getSingleton("<font color="#9c27b0">person</font>", false)</div><div>返回从二级缓存 【earlySingletonObjects】 获取到的 bean 对象</div>
<div>addSingleton("<font color="#2196f3">dog</font>", singletonObject)<br>向一级缓存【singletonFactories】添加 bean 对象</div>从三级缓存【singletonFactories】移除<br>从二级缓存【earlySingletonObjects】移除
0 条评论
下一页