【Spring】循环依赖

什么是循环依赖

在这里插入图片描述

循环依赖(Circular Dependency),也称为循环引用,是指两个或多个对象(在Spring框架中通常指的是Bean)之间相互依赖,最终形成了一个依赖的闭环。具体来说,如果对象A依赖于对象B,而对象B又依赖于对象A,或者通过其他对象间接形成依赖闭环,那么这种情况就被称为循环依赖。

两种注入方式对循环依赖的影响

构造方法注入

构造方法注入要求在Bean实例化时就必须提供所有必要的依赖。这意味着,如果Bean A的构造方法依赖于Bean B,而Bean B的构造方法又依赖于Bean A,那么Spring在尝试创建这两个Bean时就会陷入一个死循环。因为Spring需要先创建Bean B来实例化Bean A,但同时又需要Bean A来实例化Bean B。

set方法注入

先无参构造,后set注入

三级缓存

  • 单例池(Singleton Objects Cache):这可以看作是Spring中的“一级缓存”。它存储了已经完全初始化好的Bean实例。当一个Bean被完全初始化后,它会被放入这个缓存中,以供后续直接使用。
  • 早期曝光对象缓存(Early Singleton Objects Cache):这可以看作是“二级缓存”。在处理循环依赖时,如果一个Bean正在被创建,但尚未完成初始化(比如其依赖项尚未注入),这个Bean的早期版本(即还未设置其依赖项的版本)会被放入这个缓存中。这样,如果另一个Bean在创建过程中需要依赖这个正在创建的Bean,就可以从这个缓存中获取到这个Bean的早期版本。
  • 原始Bean工厂缓存(Singleton Factories Cache):这可以看作是“三级缓存”。它存储的是ObjectFactory对象,这些对象用于生成Bean的实例。当一个Bean被创建但尚未初始化时,Spring会为这个Bean生成一个ObjectFactory,并将其放入这个缓存中。如果其他Bean需要这个Bean的实例,Spring会从缓存中获取ObjectFactory,并调用其方法来生成Bean的实例。这样做的好处是,它允许Spring在Bean完全初始化之前,就提供一个Bean的实例给其他Bean使用,从而解决了循环依赖的问题。

在这里插入图片描述

无法解决的循环依赖情况

  1. 构造方法注入无法解决循环依赖问题

相关推荐

  1. Spring 循环依赖详解

    2024-07-12 10:16:01       41 阅读
  2. Spring依赖注入、循环依赖——三级缓存

    2024-07-12 10:16:01       30 阅读
  3. Spring如何解决循环依赖

    2024-07-12 10:16:01       43 阅读

最近更新

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

    2024-07-12 10:16:01       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 10:16:01       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 10:16:01       57 阅读
  4. Python语言-面向对象

    2024-07-12 10:16:01       68 阅读

热门阅读

  1. Perl 语言进阶学习

    2024-07-12 10:16:01       27 阅读
  2. 超参数的艺术:Mojo模型与动态超参数调整

    2024-07-12 10:16:01       26 阅读
  3. 浅拷贝和深拷贝浅析

    2024-07-12 10:16:01       24 阅读
  4. easyX的基本绘制使用案例

    2024-07-12 10:16:01       25 阅读
  5. 基于gunicorn+flask+docker模型高并发部署

    2024-07-12 10:16:01       24 阅读
  6. 高级IO_多路转接之ET模式Reactor

    2024-07-12 10:16:01       16 阅读
  7. 递归生成对象

    2024-07-12 10:16:01       24 阅读