Spring 循环依赖

2020-09-07  本文已影响0人  ruisheng

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

  1. createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象。
  2. populateBean:填充属性,这一步主要是多bean的依赖属性进行填充。
  3. 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方法中

  1. createBeanInstance:实例化bean.
  2. addSingletonFactory:提前暴露一个工厂。把singletonFactory 放到singletonFactories中。
  3. populateBean :填充属性。
    addSingletonFactorycreateBeanInstance后,在populateBean()之前执行。也就是该单例对象已经被创建出来了(调用了构造器),然后将自己提前曝光到singletonFactories(三级缓存中)中。
上一篇下一篇

猜你喜欢

热点阅读