美文网首页
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