IOC的底层原理 :
Spring是如何循环依赖的。(三级缓存,提前曝光):
循环依赖的定义:循环依赖就是循环引用,也就是两个或两个以上bean对象互相持有对方,最终形成闭环,比如A依赖B,B依赖C,C依赖A,形式循环依赖。
第一级缓存SingletoObjects:也叫单例池,存放已经经历了完整生命周期的Bean对象。(已经实例化和初始化)(最终完整结果的对象)
第二级缓存earlySingletoObjects:存放早期暴露出来的Bean对象,实例化以后,就把对象放到这个Map中。(Bean可能只经过实例化,属性还未填充,可以理解为已经是实例化,但未初始化)。(l理解为对象相互移动的中转站)
第三级缓存singletonFactories:存放早期暴露的Bean的工厂。(理解为存放的是提前暴露的实例)
Spring单列对象初始化步奏:
createBeanInstances实例化:调用对象的构造方法实例化对象。
populateBean属性填充:主要对应Bean的依赖属性进行填充
initalizeBean:调用applionContext.xml中的init初始化方法
A依赖B,B依赖A
1、首先 A 完成初始化第一步并将自己提前曝光出来(通过 ObjectFactory 将自己提前曝光),于是先将A放到三级缓存,去实例化B。
2、然后就走B创建的过程,B初始化的过程中发现需要A,于是B先查一级缓存寻找A,如果没有,再查二级缓存,如果还没有,再查三级缓存,找到了A,可以通过 ObjectFactory#getObject() 方法来拿到 A 对象,然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A。(可以理解为将A从三级缓存剪切到二级缓存中)
3、B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中的状态)。然后回来接着创建A,此时B已经创建结束,可以直接从一级缓存里面拿到B,去完成A的创建,并将A放到一级缓存。