spring单例对象的初始化大略分为三步
- createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象。
- populateBean:填充属性,这一步主要是多bean的依赖属性进行填充。
- initializeBean:调用spring xml中的init 方法。
spring为了解决循环依赖,使用了三级缓存
//singletonObjects:完成初始化的单例对象的cache(一级缓存)
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
//earlySingletonObjects :完成实例化但是尚未初始化的,提前暴光的单例对象的Cache (二级缓存)
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
//singletonFactories : 进入实例化阶段的单例对象工厂的cache (三级缓存)
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
方法中
-
createBeanInstance
:实例化bean. -
addSingletonFactory
:提前暴露一个工厂。把singletonFactory 放到singletonFactories中。 -
populateBean
:填充属性。
addSingletonFactory
在createBeanInstance
后,在populateBean()之前执行。也就是该单例对象已经被创建出来了(调用了构造器),然后将自己提前曝光到singletonFactories(三级缓存中)中。
网友评论