美文网首页
Spring解决循环依赖

Spring解决循环依赖

作者: 知而乐者 | 来源:发表于2021-05-18 12:40 被阅读0次

什么是循环依赖

循环依赖就是,A依赖B,B也依赖A,及A中有B类型的成员变量,B中也有A类型的成员变量,在创建各个对象之后需要将属性设置进去

普通的解决方式

  1. 创建A对象
  2. 将A对象放入一个正在创建的Map缓冲中
  3. 发现依赖B对象进行B对象的创建
  4. 创建B对象
  5. 发现有属性依赖A对象,从已经创建好和正在创建的Map缓存中获取,进行赋值
  6. B创建成功将对象放入创建好的Map池中
  7. 继续A对象的创建
    从上面可以看到需要两个Map,一个存储已经创建好的,一个存储正在创建的

Spring的解决方式

Spring中在解决循环依赖的使用了三个Map

//存放已经创建好的对象(属性等所有的方法都已经设置)
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
//存储实例化好的对象,但是没有做一些必要操作的对象(使用SmartInstantiationAwareBeanPostProcessor来进行操作,比如需要转成AOP代理类)
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);
//存储实例化好的对象,已经做过一些必要操作的对象
    private final Map<String, Object> earlySingletonObjects = new HashMap(16);

使用三个Map的原因是,考虑到有些对象在实例化好后,还必需要做一些初始化或者其他操作,比如生成代理对象,(其他对象依赖的应该都是代理对象),所以会有三个Map
所以三个Map的逻辑为:

  1. 先从singletonObjects取
  2. 不存在在从earlySingletonObjects取
  3. 如果earlySingletonObjects也不存在则从singletonFactories取,同时调用getObject方法来进行实例化对象的"初始化"操作,之后将对象放入earlySingletonObjects中,避免重复"初始化"

注意:所以如果依赖是通过构造函数循环依赖则会报错

思考:为什么不在实例化之后,直接”初始化“呢?而是用一种懒初始化的方式

相关文章

  • Spring 是如何解决循环依赖的?

    Spring 是如何解决循环依赖的? 循环依赖: Spring 循环依赖有三种情况: 构造器的循环依赖,这种依赖 ...

  • Spring是怎么解决循环依赖的?

    Spring是怎么解决循环依赖的?首先,Spring 解决循环依赖有两个前提条件: 不全是构造器方式的循环依赖必须...

  • spring循环依赖的解决方案

    spring循环依赖的解决方案 Spring IOC循环依赖解决方案分析 这里Spring主要用了三层缓存来完成对...

  • Spring解决循环依赖

    Spring解决循环依赖 Spring通过三级缓存来解决循环依赖,一级缓存为单例池(singletonObject...

  • Spring循环依赖问题

    什么是循环依赖 循环依赖就是两个对象之间存在相互依赖的关系; Spring是如何解决循环依赖的 Spring使用三...

  • 2020-05-16

    Spring IOC 容器源码分析 - 循环依赖的解决办法 本文,我们来看一下 Spring 是如何解决循环依赖问...

  • 一文详解Spring中的循环依赖,面试必杀技

    目录 前言 什么是循环依赖? 什么情况下循环依赖可以被处理? Spring是如何解决的循环依赖? 简单的循环依赖(...

  • Spring解决循环依赖

    Spring当中的循环依赖问题是面试中经常提及的,这一次我们就来聊一聊这个问题。首先,循环依赖其实指的就是多个类之...

  • Spring 解决循环依赖

    [toc] 循环依赖 循环依赖就是N个类中循环嵌套引用,如果日常开发中我们用new对象的方式发生这种循环依赖的程序...

  • Spring解决循环依赖

    1、什么是循环依赖 循环依赖就是循环引用,就是两个或多个bean相互之间的持有对方,比如A引用B,而B又引用A,则...

网友评论

      本文标题:Spring解决循环依赖

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