当前位置: 首页 > article >正文

Spring循环依赖终极解决方案:从BeanCurrentlyInCreationException到根治的完整指南

Spring循环依赖终极解决方案从BeanCurrentlyInCreationException到根治的完整指南【免费下载链接】spring-frameworkSpring Framework项目地址: https://gitcode.com/gh_mirrors/sp/spring-frameworkSpring Framework作为企业级开发的中流砥柱其依赖注入机制极大简化了组件管理。但Bean之间的循环依赖常导致BeanCurrentlyInCreationException异常让开发者头疼不已。本文将系统剖析循环依赖的本质结合Spring源码与实践案例提供从诊断到根治的完整解决方案助你轻松化解依赖困境。一、循环依赖的前世今生为何单例Bean能自愈而原型Bean不行循环依赖指两个或多个Bean相互引用形成闭环如A依赖BB依赖A。Spring容器在初始化Bean时若发现这种闭环引用就会抛出BeanCurrentlyInCreationException。但有趣的是单例作用域的Bean默认支持循环依赖而原型Bean却不行这背后藏着Spring的核心设计逻辑。1.1 单例Bean的三级缓存自救机制Spring通过三级缓存singletonObjects、earlySingletonObjects、singletonFactories实现单例Bean的循环依赖处理一级缓存存储完全初始化的单例Bean二级缓存存储提前暴露的半成品Bean已实例化但未完成属性注入三级缓存存储Bean工厂用于生成半成品Bean的代理对象当检测到循环依赖时Spring会从三级缓存中获取提前暴露的Bean引用打破依赖闭环。这种机制在DefaultSingletonBeanRegistry.java中实现核心代码如下// 尝试从缓存获取Bean若为循环依赖则提前暴露 protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject this.singletonObjects.get(beanName); if (singletonObject null isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { singletonObject this.earlySingletonObjects.get(beanName); if (singletonObject null allowEarlyReference) { ObjectFactory? singletonFactory this.singletonFactories.get(beanName); if (singletonFactory ! null) { singletonObject singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return singletonObject; }1.2 原型Bean为何无药可救与单例Bean不同原型Bean每次获取都会创建新实例无法利用缓存机制。从下图可以清晰看到原型Bean的循环引用会导致无限递归创建图原型Bean循环依赖会导致每次引用都创建新实例最终触发创建异常而单例Bean通过共享实例避免了这个问题图单例Bean通过共享实例实现依赖注入天然支持循环引用场景二、实战诊断3步定位循环依赖根源当BeanCurrentlyInCreationException发生时不要慌张按以下步骤精准定位问题2.1 解读异常堆栈找线索异常信息通常包含关键提示如Requested bean is currently in creation: Is there an unresolvable circular reference?从Spring源码BeanCurrentlyInCreationException.java的构造函数可知这表明容器检测到闭环依赖且无法解析public BeanCurrentlyInCreationException(String beanName) { super(beanName, Requested bean is currently in creation: Is there an unresolvable circular reference or an asynchronous initialization dependency?); }2.2 检查Bean作用域组合常见问题组合❌ 原型Bean依赖单例Bean无法缓存原型实例❌ 构造器注入形成闭环构造阶段无法提前暴露Bean✅ 单例Bean间的字段注入Spring默认支持2.3 使用依赖分析工具Spring提供BeanFactoryUtils和DependencyGraph类帮助分析依赖关系// 分析Bean依赖关系的工具类 org.springframework.beans.factory.BeanFactoryUtils org.springframework.context.support.DependencyGraph三、5种解决方案从规避到根治根据场景选择最合适的解决方案按推荐优先级排序3.1 最佳实践重构代码消除依赖闭环 最彻底的方法是通过领域设计优化打破循环依赖例如提取公共依赖到新Bean如将A和B都依赖的逻辑抽为C使用观察者模式解耦事件发布/订阅引入接口层隔离依赖抽象而非具体实现3.2 快速修复使用Lazy延迟加载在循环依赖的任意一方添加Lazy注解使Bean在首次使用时才初始化Service public class AService { private final BService bService; public AService(Lazy BService bService) { this.bService bService; } }原理Lazy会创建代理对象暂时代替真实Bean打破初始化闭环。3.3 字段注入代替构造器注入将构造器注入改为字段注入不推荐但可应急Service public class AService { Autowired private BService bService; // 字段注入允许循环引用 }⚠️ 注意字段注入会降低代码可测试性Spring官方更推荐构造器注入。3.4 使用DependsOn控制初始化顺序通过DependsOn明确指定Bean的初始化顺序Service DependsOn(bService) // 确保BService先于AService初始化 public class AService { private final BService bService; public AService(BService bService) { this.bService bService; } }3.5 手动获取Bean终极应急方案通过ApplicationContext在需要时手动获取BeanService public class AService implements ApplicationContextAware { private ApplicationContext context; private BService bService; Override public void setApplicationContext(ApplicationContext context) { this.context context; } public void doSomething() { // 延迟获取BService避免初始化阶段依赖 if (bService null) { bService context.getBean(BService.class); } bService.execute(); } }四、避坑指南这些场景最容易踩循环依赖的坑4.1 Async注解引发的隐藏依赖异步方法会导致Spring创建代理对象若两个Bean相互调用异步方法可能形成循环依赖。解决方案提取异步逻辑到独立Bean对异步Bean使用Lazy4.2 配置类循环依赖在Configuration类中通过Bean方法相互引用会触发循环依赖Configuration public class AppConfig { Bean public AService aService() { return new AService(bService()); // 直接调用bService()方法 } Bean public BService bService() { return new BService(aService()); } }解决使用Autowired注入依赖而非直接调用方法。4.3 多模块项目的跨模块依赖微服务或多模块项目中不同模块的Bean容易形成隐蔽的循环依赖。建议建立依赖检查机制如ArchUnit严格遵循依赖倒置原则五、总结循环依赖处理的黄金法则优先重构通过领域设计消除依赖闭环是最佳方案作用域匹配单例Bean优先避免原型Bean间的依赖注入策略构造器注入为主循环场景下合理使用Lazy监控预警在CI/CD流程中加入依赖分析检查Spring的循环依赖处理机制体现了其设计的精妙但开发者不应过度依赖框架特性而应通过良好的设计避免此类问题。掌握本文提供的诊断方法和解决方案你就能轻松应对BeanCurrentlyInCreationException构建更健壮的Spring应用。深入了解Spring依赖注入原理可参考官方文档framework-docs/modules/ROOT/pages/core/beans/dependencies/factory-collaborators.adoc【免费下载链接】spring-frameworkSpring Framework项目地址: https://gitcode.com/gh_mirrors/sp/spring-framework创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关文章:

Spring循环依赖终极解决方案:从BeanCurrentlyInCreationException到根治的完整指南

Spring循环依赖终极解决方案:从BeanCurrentlyInCreationException到根治的完整指南 【免费下载链接】spring-framework Spring Framework 项目地址: https://gitcode.com/gh_mirrors/sp/spring-framework Spring Framework作为企业级开发的中流砥柱&#xff…...

每日极客日报 · 2026年04月28日

每日极客日报 2026年04月28日 今日精选 20 条 IT 科技热点,覆盖 AI、开源、云原生、工程实践等领域。 🔥 今日头条 微软与 OpenAI 终止独家合作,OpenAI 向所有云厂商开放 4月27日,微软与 OpenAI 联合宣布修订延续多年的合作协议…...

Element UI表格多数据源合并终极指南:告别数据混乱,实现高效管理

Element UI表格多数据源合并终极指南:告别数据混乱,实现高效管理 【免费下载链接】element A Vue.js 2.0 UI Toolkit for Web 项目地址: https://gitcode.com/gh_mirrors/eleme/element Element UI作为一款基于Vue.js 2.0的UI工具包,提…...

AI文本隐形水印检测与去除技术解析

1. 项目概述:对抗AI文本隐形水印的技术探索最近在开发一个涉及AI生成文本处理的项目时,我发现了一个容易被忽视但极其重要的问题——主流AI模型在输出文本中植入的隐形水印。这些水印就像数字指纹一样,能够被平台方检测识别,进而追…...

Zotero重复文献合并插件:5分钟彻底清理重复条目的终极指南

Zotero重复文献合并插件:5分钟彻底清理重复条目的终极指南 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 还在为Zotero文献库中堆…...

QQ空间备份:三步永久保存你的数字青春回忆

QQ空间备份:三步永久保存你的数字青春回忆 【免费下载链接】QZoneExport QQ空间导出助手,用于备份QQ空间的说说、日志、私密日记、相册、视频、留言板、QQ好友、收藏夹、分享、最近访客为文件,便于迁移与保存 项目地址: https://gitcode.co…...

告别插件安装烦恼:Zotero插件市场让你3分钟完成插件管理革命

告别插件安装烦恼:Zotero插件市场让你3分钟完成插件管理革命 【免费下载链接】zotero-addons Zotero Add-on Market | Zotero插件市场 | Browsing, installing, and reviewing plugins within Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-addons …...

30分钟打造高颜值数据看板:Materialize+Chart.js实战指南

30分钟打造高颜值数据看板:MaterializeChart.js实战指南 【免费下载链接】materialize Materialize, a CSS Framework based on Material Design 项目地址: https://gitcode.com/gh_mirrors/ma/materialize Materialize是基于Material Design的CSS框架&#…...

番茄小说下载器终极指南:3分钟打造个人离线图书馆

番茄小说下载器终极指南:3分钟打造个人离线图书馆 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否厌倦了在手机上阅读小说时被广告频繁打断?是否…...

SOCD Cleaner终极指南:游戏键盘输入冲突仲裁的完整解决方案

SOCD Cleaner终极指南:游戏键盘输入冲突仲裁的完整解决方案 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd SOCD Cleaner(又称Hitboxer)是一款专为竞技游戏玩家设计的开源键盘…...

S32K3xx硬件CRC配置避坑指南:为什么你的CRC校验总出错?可能是这3个配置细节没搞对

S32K3xx硬件CRC配置避坑指南:工程师最常忽略的3个致命细节 在嵌入式系统开发中,CRC校验作为数据完整性的重要保障手段,其配置正确性直接关系到系统可靠性。NXP S32K3xx系列MCU凭借其硬件CRC加速模块,为开发者提供了高效的校验解决…...

VS Code MCP插件生态搭建实战:从零到日均300+开发者协同的7步标准化流程

更多请点击: https://intelliparadigm.com 第一章:VS Code MCP插件生态搭建手册 MCP(Model Context Protocol)是新一代AI原生开发协议,旨在标准化大模型与本地开发工具之间的上下文交互。VS Code 作为主流编辑器&…...

CoCo框架:代码驱动的图像生成技术解析

1. CoCo框架:代码驱动的图像生成革命在2025年的多模态生成领域,一个名为CoCo(Code-as-CoT)的框架正在重塑文本到图像生成的范式。与主流扩散模型不同,CoCo通过生成可执行代码作为中间表示,实现了对图像空间…...

【内部泄露版技术白皮书首发】:Docker AI Toolkit 2026底层架构图+性能压测原始数据(NVIDIA A100/H100/MI300X三平台对比),限时开放下载24小时

更多请点击: https://intelliparadigm.com 第一章:Docker AI Toolkit 2026核心定位与白皮书解读 Docker AI Toolkit 2026 是 Docker 官方联合 CNCF AI Working Group 推出的下一代容器化 AI 开发基础设施套件,聚焦于统一模型训练、推理服务、…...

AI Agent技能生态全解析:从核心概念到实战开发指南

1. 项目概述:一份AI Agent技能生态的“藏宝图”如果你最近在折腾AI智能体,尤其是像Claude Code、Cursor这类能帮你写代码、处理复杂任务的AI助手,那你大概率已经听过“Agent Skills”这个词了。简单来说,Agent Skills就是给这些AI…...

别再死记硬背LVS概念了!用5分钟搞懂它到底在比什么(附EDA工具实战流程)

芯片验证新视角:用建筑工地思维秒懂LVS核心逻辑 想象你是一位建筑监理,面前摊开两张图纸:一张是建筑师绘制的精美效果图,标注了每个房间的功能和连接关系;另一张是施工队提交的钢筋水泥结构图,密密麻麻标注…...

数据安全防线:如何用ArchiveBox构建完整的网页归档系统

数据安全防线:如何用ArchiveBox构建完整的网页归档系统 【免费下载链接】ArchiveBox 🗃 Open source self-hosted web archiving. Takes URLs/browser history/bookmarks/Pocket/Pinboard/etc., saves HTML, JS, PDFs, media, and more... 项目地址: h…...

EmbedIQ:统一AI编码助手配置,实现企业级安全与合规自动化

1. 项目概述:一个为AI编码助手生成“灵魂”的配置工厂如果你和我一样,在团队里同时用着Claude Code、Cursor、GitHub Copilot,甚至还在尝试Gemini和Windsurf,那你一定体会过那种“精神分裂”般的痛苦。每个工具都有自己的配置格式…...

WeChatExporter完整指南:三步永久备份微信聊天记录的终极方案

WeChatExporter完整指南:三步永久备份微信聊天记录的终极方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失或系统重置而丢失珍贵的微信…...

自动化项目引导:从环境搭建到新人上手的工程实践

1. 项目概述与核心价值最近在梳理团队新成员入职流程时,发现了一个普遍存在的痛点:无论公司规模大小,新人的“上手期”总是充满了混乱和低效。信息散落在各个角落,工具权限申请像闯关,代码库在哪、怎么跑起来、遇到问题…...

laravel-filemanager高级定制:解锁媒体管理系统的无限可能

laravel-filemanager高级定制:解锁媒体管理系统的无限可能 【免费下载链接】laravel-filemanager Media gallery with CKEditor, TinyMCE and Summernote support. Built on Laravel file system. 项目地址: https://gitcode.com/gh_mirrors/la/laravel-filemanag…...

FigmaCN:3分钟极速汉化Figma界面,设计师必备中文插件终极指南

FigmaCN:3分钟极速汉化Figma界面,设计师必备中文插件终极指南 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而头疼吗?作为一…...

GetQzonehistory:一键备份QQ空间说说的终极解决方案

GetQzonehistory:一键备份QQ空间说说的终极解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory QQ空间承载了我们太多的青春回忆,那些年发的说说、晒的图片、…...

介绍《传感器与检测技术(第3版)》

《传感器与检测技术(第3版)》胡向东主编的课后习题参考答案汇编,内容涵盖传感器原理、特性、分类、典型传感器工作原理及应用、检测 总体概览 《传感器与检测技术(第3版)》通常指的是由胡向东 教授主编,机…...

[具身智能-484]:OpenAI API:在 OpenAI 的生态中,所谓的“智能体 API”并不是指某一个单一的接口,而是指构建 AI 智能体所需的一整套技术栈。

在 OpenAI 的生态中,所谓的“智能体 API”并不是指某一个单一的接口,而是指构建 AI 智能体所需的一整套技术栈。简单来说,OpenAI 通过“大脑”(模型) “手脚”(工具/沙箱) “记忆”&#xff0…...

Bili2Text:三步将B站视频秒变文字稿,解放你的双手

Bili2Text:三步将B站视频秒变文字稿,解放你的双手 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为整理B站视频内容而头疼吗&…...

5分钟掌握魔兽争霸III WarcraftHelper插件:解锁300帧+宽屏完美体验终极指南

5分钟掌握魔兽争霸III WarcraftHelper插件:解锁300帧宽屏完美体验终极指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸…...

密码安全最佳实践:结合password_compat构建健壮认证系统

密码安全最佳实践:结合password_compat构建健壮认证系统 【免费下载链接】password_compat Compatibility with the password_* functions that ship with PHP 5.5 项目地址: https://gitcode.com/gh_mirrors/pa/password_compat 在当今数字化时代&#xff0…...

操作系统内存管理实践:从物理页帧到kmalloc的完整实现

1. 项目概述:一个关于内存管理的操作系统实践最近在社区里看到不少朋友对操作系统的内存管理模块感兴趣,但苦于理论抽象,动手实践又不知从何开始。正好,我最近花了不少时间研究一个名为claw-memory-os的项目,它不是一个…...

BuildingMachineLearningSystemsWithPython部署指南:如何将机器学习模型投入生产环境

BuildingMachineLearningSystemsWithPython部署指南:如何将机器学习模型投入生产环境 【免费下载链接】BuildingMachineLearningSystemsWithPython Source Code for the book Building Machine Learning Systems with Python 项目地址: https://gitcode.com/gh_mi…...