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

【Spring Boot】Spring Boot解决循环依赖

循环依赖的定义与问题

循环依赖是指两个或多个Bean相互依赖,形成闭环。例如Bean A依赖Bean B,Bean B又依赖Bean A。Spring默认不支持这种场景,会抛出BeanCurrentlyInCreationException

使用构造器注入的解决方案

构造器注入是Spring推荐的方式,但无法直接解决循环依赖。需要在设计层面避免这种场景,或改用setter注入。重构代码是更根本的解决方式,例如提取公共逻辑到第三个Bean中。

使用setter注入解决循环依赖

Spring通过三级缓存机制支持setter注入的循环依赖:

  1. 一级缓存:存放完全初始化好的Bean
  2. 二级缓存:存放早期暴露的原始Bean(未填充属性)
  3. 三级缓存:存放Bean工厂,用于生成原始对象
// Bean A
@Component
public class A {private B b;@Autowiredpublic void setB(B b) {this.b = b;}
}// Bean B
@Component
public class B {private A a;@Autowiredpublic void setA(A a) {this.a = a;}
}

使用@Lazy延迟加载

在其中一个依赖上添加@Lazy注解,延迟初始化Bean:

@Component
public class A {private final B b;public A(@Lazy B b) {this.b = b;}
}

使用ApplicationContext主动获取

在Bean初始化完成后通过ApplicationContext获取依赖:

@Component
public class A implements ApplicationContextAware {private B b;@Overridepublic void setApplicationContext(ApplicationContext ctx) {this.b = ctx.getBean(B.class);}
}

调整Bean初始化顺序

通过@DependsOn注解强制指定初始化顺序:

@Component
@DependsOn("b")
public class A {@Autowiredprivate B b;
}@Component
public class B {// 无需依赖A
}

最佳实践建议

  1. 优先考虑重构代码结构,消除循环依赖
  2. 必须使用循环依赖时选择setter注入方式
  3. 对于特定场景可以使用@Lazy临时解决方案
  4. 避免在构造函数中进行业务逻辑操作

循环依赖可能掩盖设计问题,应谨慎使用解决方案而非将其作为常规设计模式。

http://www.dtcms.com/a/552825.html

相关文章:

  • 网站开发发展趋势2018网上建立网站赚钱
  • SuperMap Hi-Fi 3D SDK for Unreal 使用蓝图接口加载多源数据
  • 【Java】如何使用jdbc连接并操作MySQL,一文读
  • SSM宠物寄养系统ih041gj7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 网站广告素材php网站免费模板
  • 还在用JDK8?JDK8升级JDK11:一次价值千万的升级指南
  • 深圳网站建设模板乐云seo与设计行业相关的网站
  • 缓存异常:缓存穿透、缓存击穿、缓存雪崩
  • 【计算机网络】IO复用方法(二)——Select
  • 【Java EE进阶 --- SpringBoot】统一功能处理(拦截器)
  • 主流数据分析工具全景对比:Excel / Python / R / Power BI / Tableau / Qlik / Snowflake
  • 从被动防御到主动管控:雷池SafeLine的远程安全运营之道
  • 人体静电消除器安全设计 蒙冬智能
  • 我想要个网站深圳最新招聘
  • Hybrid OCR-LLM框架用于在大量复杂密集企业级文档信息提取
  • 仙居做网站在哪里做项目网格化管理方案
  • ubuntu部署whisper+speaker_large+qwen【一】
  • 四大主流平台深度测评:2025企业自动化运维平台选型指南,自动化巡检平台适配关键场景
  • 计算机毕业设计 基于Python的热门游戏推荐系统的设计与实现 Django 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 每周读书与学习->JMeter主要元件详细介绍(三)逻辑控制器
  • QML学习笔记(四十八)QML与C++交互:QML中可实例化C++对象
  • 深信服上网行为 SANGFOR_AC_v11.0_AD域密码认证配置
  • RKNN-Toolkit2入门
  • 服务器公网IP、私网IP、弹性IP是什么?区别与应
  • 无锡哪家做网站好怎么做公司网站文案
  • php做网站架构图建站时候源码有验证怎么办
  • 10. 引用计数
  • 利用DeepSeek辅助改写luadbi-duckdb支持日期和时间戳数据类型
  • 用 Redis 的 List 存储库存队列,并通过 LPOP 原子性出队来保证并发安全案例
  • 定制开发开源AI智能名片S2B2C商城系统:新零售革命下云零售模式的创新实践