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--是如何解决单例模式下循环依赖问题的的更多相关文章

  1. Spring IOC 容器源码分析 - 循环依赖的解决办法

    1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...

  2. 深谈Spring如何解决Bean的循环依赖

    1. 什么是循环依赖 Java循环依赖指的是两个或多个类之间的相互依赖,形成了一个循环的依赖关系,这会导致程序编译失败或运行时出现异常.下面小岳就带大家来详细分析下Java循环依赖. 简单来讲就是:假 ...

  3. spring如何解决单例循环依赖问题?

    更多文章点击--spring源码分析系列 1.spring循环依赖场景2.循环依赖解决方式: 三级缓存 1.spring循环引用场景 循环依赖的产生可能有很多种情况,例如: A的构造方法中依赖了B的实 ...

  4. 解决spring boot 2.6.4版本循环依赖问题

    引用spring boot 2.6.4 版本 报循环依赖错误 *************************** APPLICATION FAILED TO START ************* ...

  5. Spring是如何解决循环依赖的

    前言 在面试的时候这两年有一个非常高频的关于spring的问题,那就是spring是如何解决循环依赖的.这个问题听着就是轻描淡写的一句话,其实考察的内容还是非常多的,主要还是考察的应聘者有没有研究过s ...

  6. Spring解决循环依赖,你真的懂了吗?

    导读 前几天发表的文章SpringBoot多数据源动态切换和SpringBoot整合多数据源的巨坑中,提到了一个坑就是动态数据源添加@Primary接口就会造成循环依赖异常,如下图: 这个就是典型的构 ...

  7. Spring如何解决循环依赖,你真的懂了?

    导读 前几天发表的文章SpringBoot多数据源动态切换和SpringBoot整合多数据源的巨坑中,提到了一个坑就是动态数据源添加@Primary接口就会造成循环依赖异常,如下图: 这个就是典型的构 ...

  8. Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)

    上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...

  9. 3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖

    本次博客的目标 1. 手写spring循环依赖的整个过程 2. spring怎么解决循环依赖 3. 为什么要二级缓存和三级缓存 4. spring有没有解决构造函数的循环依赖 5. spring有没有 ...

  10. Spring里bean之间的循环依赖解决与源码解读

    通过前几节的分析,已经成功将bean实例化,但是大家一定要将bean的实例化和完成bean的创建区分开,bean的实例化仅仅是获得了bean的实例,该bean仍在继续创建之中,之后在该bean实例的基 ...

随机推荐

  1. 关于RichEdit的那些坑

    项目开发中用到了richedit,但是并没有用到图文的功能,只是说使用他的各种属性,集成了一个自己的超文本编辑器. 开发遇到了各种坑,在这里跟大家分享下: 1: 跳转编辑界面,无法获取焦点. 通过Ri ...

  2. 合宙esp32 c3 micro python 固件配置(基于thonny)

    首先,本文档是已经配置过其他esp32后发现合宙的配置需要修改一些地方. 为了让新手们减少掉坑成本,故做了一个图文指导. 准备工作: 1.thonny安装(不讲,自己去查教程) 2.esp32c3 m ...

  3. zabbix+oracle环境部署

    oracle11安装完成后, 实例名: zbx01 oracle创建zbx01用户:col file_name for a60;set linesize 160;select file_name,ta ...

  4. windows server 2019 IIS网站属性上没有asp.net标签 ,aspnet_regiis -i 不能安装用命令解决

    用如下命令安装: dism /online /enable-feature /featurename:IIS-ASPNET45 /all

  5. 如何更好的分析潜在人脉?聊聊华为云图引擎GES的Cypher子查询

    摘要:本文以华为云图引擎 GES 为例,来介绍如何使用图查询语言 Cypher 表达一些需要做数据局部遍历的场景. 本文分享自华为云社区<使用 Cypher 子查询进行图探索 -- 以华为云图引 ...

  6. 如何快速准备高质量的AI数据?

    摘要:随着AI的快速发展,如何快速准备大量高质量的数据已经成为AI开发过程中一个极具挑战性的问题! 本文分享自华为云社区<如何快速准备高质量的AI数据?>,原文作者:徐波. 一.背景 通常 ...

  7. 认识一下MRS里的“中间人”Alluxio

    摘要:Alluxio在mrs的数据处理生态中处于计算和存储之间,为上层spark.presto.mapredue.hive计算框架提供了数据抽象层,计算框架可以通过统一的客户端api和全局命名空间访问 ...

  8. OpenMetric与时序数据库模型之主流TSDB分析

    摘要:为大家带来当下时序数据模型的主流TSDB分析及云厂商在时序数据模型方面的最新动态. 本文分享自华为云社区<[万字干货]OpenMetric与时序数据库存储模型分析(下)>,作者:敏捷 ...

  9. 处理开发者账号到期导致APP下架的方处理开发者账号到期导致APP下架的方法

    ​ 开发人员账号到期时,应采取以下步骤处理APP被下架问题: 登录开发者账号. 点击右上角的"账户",选择"续费". 输入信用卡信息,确保使用支持Visa的银行 ...

  10. 火山引擎数智平台协助洞察美图类APP新增长,付费用户转化超过 124%

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 美图类 APP 的下一个增长点在哪里? 目前,国内市场上的美图类 APP 大多都遵循着基础功能免费使用.个性化热门 ...