Java高频面试题:Spring是如何解决Bean的循环依赖?

大家好,我是锋哥。今天分享关于【Java高频面试题:Spring是如何解决Bean的循环依赖?】**面试题。**希望对大家有帮助;

Java高频面试题:Spring是如何解决Bean的循环依赖?

Spring 通过三种方式来解决 Bean 的循环依赖问题,具体如下:

  1. 构造器注入(Constructor Injection)

    • 当使用构造器注入时,Spring 无法处理循环依赖。因为构造器注入会在 Bean 创建时立即要求依赖的其他 Bean,这会导致死锁问题。因此,Spring 不推荐在有循环依赖的情况下使用构造器注入。
  2. Setter 注入(Setter Injection)

    • Setter 注入是 Spring 解决循环依赖的常用方式。Spring 容器会首先实例化一个 Bean 的对象,但并不立即完成依赖注入。它会先将该对象创建出来并缓存到容器中,然后继续创建其他 Bean。待所有的 Bean 都创建完成后,Spring 再为这些 Bean 注入依赖。通过这种方式,Spring 可以避免因循环依赖而导致的死锁问题。
  3. 三级缓存机制

    • Spring 容器在处理循环依赖时,采用了三级缓存机制来解决。具体流程如下:
      • 第一级缓存(Singleton Beans):存放单例 Bean 的最终实例。
      • 第二级缓存(Early References):存放 Bean 的半成品实例,即正在创建中的 Bean 对象。
      • 第三级缓存(SingletonFactories):存放一个通过工厂方法创建的 Bean,解决了依赖注入时的循环依赖问题。

    这个机制的核心思想是,Spring 在创建 Bean 时,如果遇到循环依赖,先创建一个对象的半成品(即不完全的对象),并将其存入 "Early References" 缓存中。当其他 Bean 需要该 Bean 时,Spring 会注入这个半成品实例,最后再进行完整的依赖注入。

通过这种方式,Spring 能够在不出现死锁的情况下解决循环依赖问题。

相关推荐
无限的鲜花12 小时前
反射(原创推荐)
java·开发语言
IT二叔12 小时前
Java项目部署-03-teamcity-cicd-docker镜像流水线方式部署
java·ci/cd·持续部署
yongche_shi12 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
一路向北he12 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
超级数据查看器13 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
AI行业学习14 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
折哥的程序人生 · 物流技术专研14 小时前
《Java 100 天进阶之路》第50篇:阻塞队列与并发容器(2026版)
java·面试题·java进阶·blockingqueue·并发容器·集合源码·java100天进阶
ai_coder_ai14 小时前
编写自动化脚本,在自己后端服务中使用Open Api进行设备相关操作
java·运维·自动化
大圣编程14 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
硕风和炜15 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集