Spring 如何解决 Bean 循环依赖

2024-05-11 1076阅读

循环依赖解释

bean A 属性注入时依赖bean B ,并且bean B属性注入时也依赖bean A ,造成 bean A 和bean B 都无法完成初始化问题,形成了闭环。

Spring 如何解决 Bean 循环依赖
(图片来源网络,侵删)

注意

项目中存在Bean的循环依赖,是Bean对象职责划分不明确、代码质量不高的表现,如果存在大量的Bean之间循环依赖,那么代码的整体设计也就越来越糟糕。所以SpringBoot在后续的版本中终于受不了这种滥用,默认把循环依赖给禁用了!从2.6版本开始,如果你的项目里还存在循环依赖,SpringBoot将拒绝启动!

spring 如何解决循环依赖的?

Spring解决循环依赖的核心思想在于提前曝光,使用三级缓存进行提前曝光。

使用三级缓存去解决的。三个Map

一级缓存 缓存的完整的bean

二级缓存 缓存的是半成品的bean

三级缓存 缓存的是函数接口:通过lambda 把方法传进去(把bean实例和bean名字传进去) (aop创建);不会立即调用。

SpringBoot2.6.0及以上 具体解决方案

最简单的方法在yaml或properties中配置spring.main.allow-circular-references=true 支持循环依赖即可

示例

TestBService 实现类 TestBServiceImpl 中 注入 TestService对象

TestService 实现类 TestServiceImpl 中注入 TestBService对象

@Service
public class TestBServiceImpl extends ServiceImpl 
implements TestBService {
    @Autowired
    private TestService testService;
}
@Service
public class TestServiceImpl extends ServiceImpl 
implements TestService {
    @Autowired
    private TestBService testBservice;
}

在 application.yml 中

spring:
  main:
    ## 支持循环依赖
    allow-circular-references: true

参考 Spring循环依赖解决方案

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]