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

    循环依赖源码流程图

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

    未完待续。。。
  • 相关阅读:
    02.CentOS Linux 7.7 Nginx安装部署文档
    rpm操作
    mysql命令行备份方法
    nginx reload的原理
    Linux操作笔记
    mysql账户授权
    centos系统内核升级
    docker随笔
    linux系统查看当前正在运行的服务
    数据库锁表问题
  • 原文地址:https://www.cnblogs.com/ssskkk/p/13375298.html
Copyright © 2011-2022 走看看