spring单例对象的初始化大略分为三步:

  • createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象
  • populateBean:填充属性,这一步主要是多bean的依赖属性进行填充
  • initializeBean:调用spring xml中的init 方法。

单例的循环依赖,怎么解决?

Spring为了解决单例的循环依赖问题,使用了三级缓存。

  1. /** Cache of singleton objects: bean name –> bean instance */
  2. private final Map singletonObjects = new ConcurrentHashMap(256);
  3. /** Cache of singleton factories: bean name –> ObjectFactory */
  4. private final Map> singletonFactories = new HashMap>(16);
  5. /** Cache of early singleton objects: bean name –> bean instance */
  6. private final Map earlySingletonObjects = new HashMap(16);

复制代码这三级缓存的作用分别是:
singletonFactories : 进入实例化阶段的单例对象工厂的cache (三级缓存)
earlySingletonObjects :完成实例化但是尚未初始化的,提前暴光的单例对象的Cache (二级缓存)
singletonObjects:完成初始化的单例对象的cache(一级缓存)