【spring6】解决循环依赖的机理

        循环依赖:A对象中有B属性。B对象中有A属性。比如:丈夫类Husband,妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。

        解决:至少一个类采用set注入 + singleton模式。

        原因:这种方式可以做到将“实例化Bean”和“给Bean属性赋值”这两个动作分开去完成。调用无参构造实例化Bean对象,可以先不赋值提前将该Bean对象“曝光”给外界,然后调用setter方法来完成赋值。我们可以先把所有的单例Bean实例化出来,放到一个集合当中(我们可以称之为缓存),所有的单例Bean全部实例化完成之后,以后我们再慢慢的调用setter方法给属性赋值。这样就解决了循环依赖的问题。

        从源码层分析:

Cache of singleton objects: bean name to bean instance. 单例对象的缓存:key存储bean名称,value存储Bean对象【一级缓存】

Cache of early singleton objects: bean name to bean instance. 早期单例对象的缓存:key存储bean名称,value存储早期的Bean对象【二级缓存】

Cache of singleton factories: bean name to ObjectFactory. 单例工厂缓存:key存储bean名称,value存储该Bean对应的ObjectFactory对象【三级缓存】

这个方法的作用是:将创建Bean对象的ObjectFactory对象提前曝光。

从源码中可以看到,spring会先从一级缓存中获取Bean,如果获取不到,则从二级缓存中获取Bean,如果二级缓存还是获取不到,则从三级缓存中获取之前曝光的ObjectFactory对象,通过ObjectFactory对象获取Bean实例,这样就解决了循环依赖的问题。

总结:

        Spring只能解决setter方法注入的单例bean之间的循环依赖。ClassA依赖ClassB,ClassB又依赖ClassA,形成依赖闭环。Spring在创建ClassA对象后,不需要等给属性赋值,直接将其曝光到bean缓存当中。在解析ClassA的属性时,又发现依赖于ClassB,再次去获取ClassB,当解析ClassB的属性时,又发现需要ClassA的属性,但此时的ClassA已经被提前曝光加入了正在创建的bean的缓存中,则无需创建新的的ClassA的实例,直接从缓存中获取即可。从而解决循环依赖问题。

相关推荐

  1. Spring循环依赖问题如何解决

    2024-04-27 05:46:01       35 阅读
  2. Spring 怎么解决循环依赖问题?

    2024-04-27 05:46:01       29 阅读
  3. Spring如何解决循环依赖

    2024-04-27 05:46:01       47 阅读
  4. Spring如何解决循环依赖

    2024-04-27 05:46:01       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 05:46:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 05:46:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 05:46:01       87 阅读
  4. Python语言-面向对象

    2024-04-27 05:46:01       96 阅读

热门阅读

  1. 怎样实现由.ui文件生成的.py文件的逻辑分离?

    2024-04-27 05:46:01       30 阅读
  2. CentOS7.9环境下安装mysql-8.0.32详解

    2024-04-27 05:46:01       31 阅读
  3. 四级英语之词类的确定

    2024-04-27 05:46:01       34 阅读
  4. C语言——通讯录实现

    2024-04-27 05:46:01       30 阅读
  5. linux下建立cpp文件,然后通过cmake编译。

    2024-04-27 05:46:01       32 阅读
  6. 【数据结构与算法】力扣 459. 重复的子字符串

    2024-04-27 05:46:01       35 阅读