美文网首页
Spring 循环依赖

Spring 循环依赖

作者: ruisheng | 来源:发表于2020-09-07 10:19 被阅读0次

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(三级缓存中)中。

相关文章

网友评论

      本文标题:Spring 循环依赖

      本文链接:https://www.haomeiwen.com/subject/hrjkektx.html