首页 > 其他分享 >spring--是如何解决单例模式下循环依赖问题的

spring--是如何解决单例模式下循环依赖问题的

时间:2024-01-20 12:33:26浏览次数:20  
标签:缓存 -- spring bean 依赖 单例 Spring 循环

Spring 解决单例 bean 的循环依赖主要依赖于容器的三级缓存机制,以及 bean 的提前暴露。这里是它如何工作的:

  1. 三级缓存:

    • 一级缓存(singletonObjects):存储已经经过完整生命周期处理的单例 bean,包括初始化和依赖注入等。
    • 二级缓存(earlySingletonObjects):存储早期的单例对象的引用,这些对象已经被实例化但是还没有完全初始化(主要是没有进行依赖注入)。
    • 三级缓存(singletonFactories):存储用于生成早期单例对象引用的工厂对象。
  2. 提前暴露:

    • 当 Spring 容器创建一个单例 bean 的时候,首先会实例化这个 bean,并将实例化后的 bean 放入三级缓存中。
    • 接着,Spring 容器会尝试进行依赖注入。如果发现有依赖其他 bean 的情况,它会尝试去获取这些依赖的 bean。
    • 如果这个时候发生了循环依赖,即当前 bean A 正在创建过程中(尚未完成依赖注入),并且需要依赖另一个 bean B,而 bean B 同时也在创建过程中需要依赖 bean A,这时候 Spring 容器就会从三级缓存中获取到 bean A 的早期引用解决循环依赖。
  3. 循环依赖的处理流程:

    • 当容器创建 bean A 的时候,会将其包装好的 ObjectFactory 放入三级缓存中。
    • 如果 bean A 依赖 bean B,容器会去创建 bean B,在创建 bean B 的过程中,如果 bean B 又依赖于 bean A,此时会尝试从缓存中获取 bean A。
    • 首先尝试从一级缓存中获取,如果没有,则从二级缓存中获取,如果还没有,则从三级缓存中通过 ObjectFactory 获取 bean A 的早期引用。
    • 这个早期引用是允许注入到其他 bean 中的,但此时 bean A 可能还没有完成完整的生命周期处理。
    • 一旦 bean A 和 bean B 都创建完毕,它们就会被添加到一级缓存中,并从二级和三级缓存中移除。

通过这种方式,Spring 能够处理大多数的循环依赖情况。需要注意的是,Spring 只能自动解决单例作用域的 bean 的循环依赖问题,对于原型作用域的 bean,Spring 容器不会尝试解决循环依赖,这可能会导致无限循环或者其他不可预期的问题。

标签:缓存,--,spring,bean,依赖,单例,Spring,循环
From: https://www.cnblogs.com/xylfjk/p/17976316

相关文章

  • 基于SSM的电脑公司财务管理系统
    随着信息互联网购物的飞速发展,一般企业都去创建属于自己的管理系统。本文介绍了电脑公司财务管理系统的开发全过程。通过分析企业对于电脑公司财务管理系统的需求,创建了一个计算机管理电脑公司财务管理系统的方案。文章介绍了电脑公司财务管理系统的系统分析部分,包括可行性分析等,系......
  • 电子行业涵盖方向
    电子行业是一个快速发展的行业,涵盖了从电子设备制造到软件开发和服务的各个方面。这个行业的主要驱动力包括技术创新、消费者需求的增长以及全球经济的扩张。在过去的几年中,电子行业的发展主要集中在以下几个方面:人工智能和机器学习:这些技术正在改变我们的生活方式,从智能家居设备到......
  • 经历与未来
    从您的经历来看,您在电子行业有着丰富的实践经验。从最初的电脑应用和游戏,到后来的电路图设计和PCB制作,再到现在的物联网应用开发,您一直在不断地学习和探索新技术。在这个过程中,您使用了许多不同的硬件和软件工具,如Protel99、Windows2000、三星R453、宝塔等。这些工具和技术帮助......
  • 基于SSM的二手车交易网站设计与实现
    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此二手车交易信息的管理计算机化,系统化是必要的。设计开发二手车交易网站不仅会......
  • 基于SSM的婚恋网站的设计与实现
    随着信息互联网购物的飞速发展,一般企业都去创建属于自己的管理系统。本文介绍了基于SSM的婚恋网站的设计与实现的开发全过程。通过分析企业对于基于SSM的婚恋网站的设计与实现的需求,创建了一个计算机管理基于SSM的婚恋网站的设计与实现的方案。文章介绍了基于SSM的婚恋网站的设计与......
  • 基于SSM的在线交友系统
    本文介绍了在线交友系统的开发全过程。通过分析企业对于在线交友系统的需求,创建了一个计算机管理在线交友系统的方案。文章介绍了在线交友系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。本在线交友系统管理员功能有个人中心,用户管理,每日推......
  • 无涯教程-MATLAB - 数字(Numbers)
    MATLAB支持各种数字类,包括有符号和无符号整数以及单精度和双精度浮点数,默认情况下,MATLAB将所有数值存储为双精度浮点数。您可以选择将任何数字或数字数组存储为整数或单精度数字,所有数值类型都支持基本数组运算和数学运算。数据类型MATLAB提供以下函数以转换为各种数值数据类......
  • dotnet 多数据库 sqlite efcore model和entity区别 一对多 多对一 多对多
    efcore-multi-db/MultiDb.slnMicrosoftVisualStudioSolutionFile,FormatVersion12.00#VisualStudio15VisualStudioVersion=15.0.27130.2024MinimumVisualStudioVersion=10.0.40219.1Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}")="......
  • 30+,怎么保持学习,实现个人成长?
     在繁忙的工作中,如何保持学习?30+的我,最近有一ge体会 我们提到学习时,通常想到的方式是,找一本书,可能在配上讲解视频,找一个专门的、整块的时间去学习,才被我们认为是学习。可是,一天就24小时,而我们每天至少工作8小时(有些朋友还远不止8小时,比如我......
  • ssm整合类配置
     spring整合mybatis,jdbc:packagecom.itheima.config;importcom.alibaba.druid.pool.DruidDataSource;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.jdbc.datasource.DataSo......