在Spring容器的生命周期中,对象都是单例的,所以会存放在缓存cache中,而Spring为了解决循环依赖的问题,使用到了三级缓存;
一级缓存:singletonObjects,单例对象的缓存;
二级缓存:earlySingletonObjects,提前曝光单例对象的缓存;
三级缓存:singletonFactory,单例工厂缓存;
单例对象初始化:createBeanInstance实例化(调用构造方法创建一个实例)->populateBean填充属性->initializeBean初始化方法;
例如A、B两个对象循环依赖,在初始化A对象解决循环依赖的核心流程如下:
B对象通过beanName去获取A会到底层调下方的方法:
@Nullable
public Object getSingleton(String beanName) {
return this.getSingleton(beanName, true);
}
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
synchronized(this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
通过beanName来获取属性的流程如下: