news 2026/8/6 15:38:45

6.Spring 是如何解决循环依赖问题的?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
6.Spring 是如何解决循环依赖问题的?

Spring 是如何解决循环依赖问题的?

1、什么是循环依赖 ?

一个或多个对象之间存在直接或间接的依赖关系,这种依赖关系构成一个环形调用,有下面 3 种方式。

经典的循环依赖

A中注入了一个B;

@Component public class A { @Autowired private B b; public A(){ System.out.println("init A"); } }

B中注入了A;

@Component public class B { @Autowired private A a; public B() { System.out.println("init B"); } }
2、Spring是利用三级缓存机制来解决循环依赖问题的

DefaultSingletonBeanRegistry

// 第一级缓存 private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); //第二级缓存 private final Map<String, Object> earlySingletonObjects = new HashMap<>(16); //第三级缓存 private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
  1. 一级缓存:单例池,用来存放已经初始化完成的单例 Bean,走完整个生命周期
  2. 二级缓存:存放原始的Bean对象,也就是说Bean里面的属性还没有进行赋(存放对象工厂生成的对象,这个对象可能是原对象,也可能是个代理对象)
  3. 三级缓存:存放Bean对象工厂,结构是 Map<String, ObjectFactory<?>>,Map 的 Value 是一个对象的工厂,用来生成原始Bean对象或者是原始对象的代理并放入到二级缓存中(打破循环依赖关键对象)
  • 如果 A 有 AOP,就返回一个代理对象;
  • 如果 A 没有 AOP,就返回原对象。
//解决循环依赖关键类: AbstractAutowireCapableBeanFactory Springboot是在613行,SpringMVC是在 588行 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));

当我们去调用getBean()方法的时候, Spring会先从一级缓存中去找到目标Bean,如果发现一级缓存中没有 便会去二级缓存中 去找,而如果一、二级缓存中都没有找到,意味着该目标Bean还没有实例化。于是,Spring容器会实例化目标Bean

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/30 14:43:08

Android设备与Mac/Docker全连接指南:有线到无线的完整方案

Android设备与Mac/Docker全连接指南&#xff1a;有线到无线&#x1f4ca; 连接方式对比表&#x1f50c; 方式一&#xff1a;USB有线连接&#xff08;基础方式&#xff09;适用场景操作步骤&#x1f4e1; 方式二&#xff1a;WiFi无线连接2.1 Android 10及以下版本&#xff08;需…

作者头像 李华
网站建设 2026/7/29 11:18:50

解码WIFI模块与IoT云平台

WIFI模块原理与应用 引言 随着物联网技术快速发展&#xff0c;越来越多的智能设备需要通过无线方式接入互联网。在众多无线通信方案中&#xff0c;**WIFI模组&#xff08;ESP8266/ESP32系列&#xff09;**因其成熟的生态和广泛的应用&#xff0c;成为实现远程控制、数据采集等…

作者头像 李华
网站建设 2026/7/31 4:04:53

【课程设计/毕业设计】基于Java+SpringBoot城市化自修室管理系统基于springboot的城市化自修室管理系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/7/30 22:26:07

Apache Atlas vs DataHub:主流数据目录工具对比评测

Apache Atlas vs DataHub&#xff1a;主流数据目录工具对比评测关键词&#xff1a;数据目录、元数据管理、Apache Atlas、DataHub、对比评测、企业级数据治理、数据发现 摘要&#xff1a;本文深入对比分析Apache Atlas与DataHub两大主流数据目录工具&#xff0c;从技术架构、核…

作者头像 李华