spring--是如何解决单例模式下循环依赖问题的
Spring 解决单例 bean 的循环依赖主要依赖于容器的三级缓存机制,以及 bean 的提前暴露。这里是它如何工作的:
三级缓存:
- 一级缓存(singletonObjects):存储已经经过完整生命周期处理的单例 bean,包括初始化和依赖注入等。
- 二级缓存(earlySingletonObjects):存储早期的单例对象的引用,这些对象已经被实例化但是还没有完全初始化(主要是没有进行依赖注入)。
- 三级缓存(singletonFactories):存储用于生成早期单例对象引用的工厂对象。
提前暴露:
- 当 Spring 容器创建一个单例 bean 的时候,首先会实例化这个 bean,并将实例化后的 bean 放入三级缓存中。
- 接着,Spring 容器会尝试进行依赖注入。如果发现有依赖其他 bean 的情况,它会尝试去获取这些依赖的 bean。
- 如果这个时候发生了循环依赖,即当前 bean A 正在创建过程中(尚未完成依赖注入),并且需要依赖另一个 bean B,而 bean B 同时也在创建过程中需要依赖 bean A,这时候 Spring 容器就会从三级缓存中获取到 bean A 的早期引用解决循环依赖。
循环依赖的处理流程:
- 当容器创建 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--是如何解决单例模式下循环依赖问题的的更多相关文章
- Spring IOC 容器源码分析 - 循环依赖的解决办法
1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...
- 深谈Spring如何解决Bean的循环依赖
1. 什么是循环依赖 Java循环依赖指的是两个或多个类之间的相互依赖,形成了一个循环的依赖关系,这会导致程序编译失败或运行时出现异常.下面小岳就带大家来详细分析下Java循环依赖. 简单来讲就是:假 ...
- spring如何解决单例循环依赖问题?
更多文章点击--spring源码分析系列 1.spring循环依赖场景2.循环依赖解决方式: 三级缓存 1.spring循环引用场景 循环依赖的产生可能有很多种情况,例如: A的构造方法中依赖了B的实 ...
- 解决spring boot 2.6.4版本循环依赖问题
引用spring boot 2.6.4 版本 报循环依赖错误 *************************** APPLICATION FAILED TO START ************* ...
- Spring是如何解决循环依赖的
前言 在面试的时候这两年有一个非常高频的关于spring的问题,那就是spring是如何解决循环依赖的.这个问题听着就是轻描淡写的一句话,其实考察的内容还是非常多的,主要还是考察的应聘者有没有研究过s ...
- Spring解决循环依赖,你真的懂了吗?
导读 前几天发表的文章SpringBoot多数据源动态切换和SpringBoot整合多数据源的巨坑中,提到了一个坑就是动态数据源添加@Primary接口就会造成循环依赖异常,如下图: 这个就是典型的构 ...
- Spring如何解决循环依赖,你真的懂了?
导读 前几天发表的文章SpringBoot多数据源动态切换和SpringBoot整合多数据源的巨坑中,提到了一个坑就是动态数据源添加@Primary接口就会造成循环依赖异常,如下图: 这个就是典型的构 ...
- Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)
上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...
- 3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖
本次博客的目标 1. 手写spring循环依赖的整个过程 2. spring怎么解决循环依赖 3. 为什么要二级缓存和三级缓存 4. spring有没有解决构造函数的循环依赖 5. spring有没有 ...
- Spring里bean之间的循环依赖解决与源码解读
通过前几节的分析,已经成功将bean实例化,但是大家一定要将bean的实例化和完成bean的创建区分开,bean的实例化仅仅是获得了bean的实例,该bean仍在继续创建之中,之后在该bean实例的基 ...
随机推荐
- 10 个免费的 AI 图片生成工具分享
原文: https://openaigptguide.com/ai-picture-generator/ 在人工智能(AI)图像生成技术的推动下,各类AI图片生成网站如雨后春笋般涌现,为我们的日常生活 ...
- C++ Qt开发:QSqlDatabase数据库组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSqlDat ...
- Python——第四章:匿名函数(lambda 函数)
匿名函数也被称为 lambda 函数 lambda 函数是一种小型.一次性的.可以在一行内定义的匿名函数.它通常用于一些简单的操作,例如传递给高阶函数(接受函数作为参数的函数)或在一行内定义短小的功能 ...
- 华硕AX系列路由器选购,以及华硕WIFI6路由器智能设备家电无法互联的解决方法。
家里昨天换了一整套wifi6路由器(华硕AX82U+XD4R),刚刚换上就发现原来的欧普智能灯和部分其他设备无法使用了,而小米等设备等都可以互联,智能家居绝大部分用的是2.4G的协议,所以说,问题出现 ...
- Pikachu漏洞靶场 Over Permission(越权)
Over Permission(越权) 文章目录 Over Permission(越权) 水平越权 垂直越权 水平越权 首先根据提示信息的账号密码登录: 点击查看个人信息: 抓包之后发现查的人是在UR ...
- 在linux系统上怎么获取命令的帮助信息及man文档划分
如何在linux系统上获取命令的帮助信息及man文档的章节划分 1.命令 -- help 2.man 命令 后者更加详细 首先帮助中尖括号<>和方括号[]以及省略号...的含义, 在方括号 ...
- kubernetes之部署war项目(二)
kubernetes之部署war项目(二) k8s系列 源自我工作上的实际场景,记录于此. 现在老项目是war包形式,需要基于tomcat部署,因此在打包镜像时将tomcat带上的. 假设我的war项 ...
- Java播放MP3播放音频
Java播放MP3播放音频 下面我演示用jdk自带包.框架等分别展示播放mp3.等music 一.使用javafx包 AudioClip 注意jdk11以上剥离了javafx public stati ...
- TypeChat、JSONSchemaChat实战 - 让ChatGPT更听你的话
TypeChat 用一句话概括,就是用了它你可以让大语言模型(比如 ChatGPT)将自然语言转换成特定类型的 JSON 数据. 我们在使用 ChatGPT 的时候,大致流程如下: 假如我们需要 Ch ...
- 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 07.在C++中使用UMG
斯坦福 UE4 C++ ActionRoguelike游戏实例教程 07.在C++中使用UMG 斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章的目标是 ...