zoukankan      html  css  js  c++  java
  • 源码阅读:Spring怎么解决循环依赖的

    Spring三级缓存

    Spring的循环依赖是靠第三级缓存实现的,简单说下一二三级缓存

    1,第一级缓存:单例缓存池singletonObjects。

    2,第二级缓存:早期提前暴露的对象缓存earlySingletonObjects。

    3,第三级缓存:singletonFactories单例对象工厂缓存

    以下是通过populateBean给属性赋值

        /**
         * Add the given singleton factory for building the specified singleton
         * if necessary.
         * <p>To be called for eager registration of singletons, e.g. to be able to
         * resolve circular references.
         * @param beanName the name of the bean
         * @param singletonFactory the factory for the singleton object
         */
        protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
            Assert.notNull(singletonFactory, "Singleton factory must not be null");
            synchronized (this.singletonObjects) {
                if (!this.singletonObjects.containsKey(beanName)) {
                    this.singletonFactories.put(beanName, singletonFactory);
                    this.earlySingletonObjects.remove(beanName);
                    this.registeredSingletons.add(beanName);
                }
            }
        }

    我们知道,创建好的对象,并不是一个完整的对象,里面的属性还没有被赋值。

    所以这个方法就是为创建好的Bean为它的属性赋值。并且调用了我们实现的的XXXAware接口进行回调初始化,。然后调用我们实现的Bean的后置处理器,给我们最后一次机会去修改Bean的属性。其他的地方我不做过多的介绍,

    我只讲一个重点就是,在populateBean里面他会解析你的属性,并且赋值,当发现,A对象里面依赖了B,此时又会走getBean方法,

    但这个时候,你去缓存中是可以拿的到的。因为我们在对createBeanInstance对象创建完成以后已经放入了缓存当中,

    所以创建B的时候发现依赖A,直接就从缓存中去拿,此时B创建完,A也创建完,一共执行了4次。至此Bean的创建完成,最后将创建好的Bean放入单例缓存池中addSingleton();

    A init
    B init
    b set a
    a set b

    至此Ioc创建Bean的整个生命周期已经介绍完毕。下面附加一张流程脑图。

    参考文章:简书:https://www.jianshu.com/p/10f94b776e55

    循环依赖源码流程图

    后序在解释这个流程图吧,暂时跟着源码走了一遍 自己都迷迷糊糊的 哈哈,,,

    未完待续。。。
  • 相关阅读:
    页面使用本地IE版本
    C#获取客户端ip
    获取存储过程返回数据
    自制js表格排序
    读取数据用rs.open sql,conn,1,1
    学习存储过程
    COLLATE Chinese_PRC_CI_AS
    sqlserver存储过程语句(转)
    用P3P header解决iframe跨域访问cookie(转载)
    java通过dom创建和解析xml
  • 原文地址:https://www.cnblogs.com/ssskkk/p/13375298.html
Copyright © 2011-2022 走看看