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

Spring的循环依赖问题

一、循环依赖是怎么产生的最经典的场景就是Bean 之间相互引用ComponentclassA{AutowiredprivateBb;}ComponentclassB{AutowiredprivateAa;} 发生了什么Spring 创建 AA 依赖 B → 去创建 B创建 B 时发现依赖 A → 又要创建 AA 还没创建完成 → 卡住 →循环依赖产生 本质Bean 创建过程中形成闭环依赖二、Spring 为什么“默认能解决”关键点只支持“单例 setter/字段注入”的循环依赖Spring 的解决方案核心是⭐ 三级缓存重点面试高频singletonObjects 一级缓存完全初始化好的BeanearlySingletonObjects 二级缓存提前暴露的Bean半成品 singletonFactories 三级缓存Bean工厂用于生成代理对象三、解决流程核心机制用 A 和 B 举例 步骤拆解创建 A此时是“半成品”把 A 的ObjectFactory 放入三级缓存A 依赖 B → 去创建 B创建 B 时依赖 A → 尝试获取 A从三级缓存拿到 A 的“早期引用”可能是代理对象B 创建完成回过头来完成 A 的初始化 这样就绕开了“死循环”四、为什么需要三级缓存很多人会问二级缓存不够吗答案不够因为要解决AOP 代理问题 关键点如果 A 需要被代理比如事务、AOP不能直接暴露原始对象必须暴露代理对象 三级缓存ObjectFactory就是为了在“提前暴露”时可以决定返回普通对象还是代理对象五、哪些情况解决不了Spring 不是万能的这些情况会直接报错❌ 1. 构造器注入Constructor InjectionclassA{publicA(Bb){}}classB{publicB(Aa){}} 原因构造器必须“完整对象”不能用半成品 → 无法提前暴露❌ 2. 原型prototype作用域 多例BeanScope(prototype) 原因Spring 不缓存 prototype Bean → 没法用三级缓存❌ 3. 循环依赖链过于复杂含 FactoryBean / 动态代理比如A → B → C → A或者涉及FactoryBeanBeanPostProcessor动态代理AOP 复杂嵌套 为什么不行 提前暴露的对象可能不是最终形态还没代理或者代理链没构建完成→ 最终导致Bean 创建异常 / 代理错乱❌ 4. AOP 循环依赖的“隐形坑”例如ServiceclassAService{AutowiredprivateBServicebService;TransactionalpublicvoidmethodA(){}}⚠️ 问题点提前暴露的是“早期对象”AOP 代理可能还没织入 结果可能是事务、切面不生效这种不是启动报错而是运行时“悄悄出 bug”❌ 5. Spring Boot 2.6 默认限制从Spring Boot 2.6开始spring.main.allow-circular-referencesfalse 默认禁止循环依赖 表现直接启动失败哪怕是 setter 注入六、如何解决循环依赖问题✅ 方法1改成 setter 注入推荐AutowiredpublicvoidsetB(Bb){this.bb;} 让 Spring 有机会“先创建半成品”✅ 方法2使用 Lazy常用技巧AutowiredLazyprivateBb; 延迟加载相当于“等真正用到你再创建”✅ 方法3拆分设计最佳实践比如A→CB→C 引入中间层打断循环✅ 方法4使用接口解耦A→IBB→IA 降低耦合避免强依赖闭环✅ 方法5手动获取 BeanApplicationContext.getBean() 不推荐但某些场景可用
http://www.rkmt.cn/news/1392606.html

相关文章:

  • ChatGPT Tasks深度实战:从定时提醒到可信赖AI工作流
  • 别再盲目喂文档了!Claude长文本推理的5个致命预设误区(92%用户正在踩坑),第3个导致法律意见书生成结果完全不可用
  • LeakCanary 概述,教程,总结
  • 基于边缘导向与多MSB自预测的加密域可逆数据隐藏技术详解
  • 网络最大流问题:从真题到解题思路全解析
  • 不同介质管路阀门口径适配经验分享
  • 专利署名别乱填!一文搞懂发明人、设计人官方认定标准
  • 智慧课堂教学质量分析系统:从数据解析到教学改进的全链路实现
  • 2026年权威披露:深度测评3大食品吸塑包装源头厂家避坑攻略+行情盘点
  • 2026年大连全屋定制工厂直营怎么选?源头工厂vs全国品牌深度横评与官方联系指南 - 精选优质企业推荐官
  • 5GT-GAN:融合自回归与对抗网络的时序数据生成,破解5G智慧城市数据困境
  • 管家婆软件|仅销售预包装食品进货台账录入教程
  • Trelby剧本创作指南:从零开始掌握专业级开源写作工具
  • 智能打牌记账本:告别手动记账的微信小程序解决方案
  • MulimgViewer终极指南:简单快速的多图像浏览器使用教程
  • 【云计算学习之路】Linux必背:100个高频命令速查手册
  • 从零到一:打造你的个人漫画图书馆——哔咔漫画下载器技术深度解析
  • Mysql的MVCC机制是什么,到底怎么理解?
  • 为claudecode配置taotoken作为备用api解决封号困扰
  • 盘点与实战:脊柱与膝关节医学影像数据集的获取与应用指南
  • Rust Web应用整数溢出实战:从‘电子木鱼’CTF题看i32的边界与安全编码
  • YOLOv5 OBB终极指南:快速实现旋转目标检测的完整实战方案
  • 掌握Kohya_SS:3步构建专属AI绘画模型的专业指南
  • Lovable边缘平台安全加固清单(CNCF认证级):从设备准入到OTA签名验证的9层防护实操
  • ROS2-Humble超好用的安装教程
  • 社区居委会科学化解12345投诉解决对策
  • SWIPT天线设计:利用再生边缘场实现无线通信与能量收集一体化
  • 折叠超立方体容错路径嵌入:相邻节点故障下的通信韧性分析
  • 2026年大连全屋定制工厂怎么选?源头直营vs中间商,一文读懂鑫盛祥、欧派、索菲亚、尚品宅配、瑞和五大品牌 - 精选优质企业推荐官
  • 3分钟解决B站缓存视频播放难题:m4s-converter完全指南