news 2026/9/24 5:41:20

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/9/20 14:02:50

TDengine C# 语言连接器入门指南

本指南汇总官网文档中 C# 初学者应该掌握的基础知识&#xff0c;覆盖安装、连接方式、基本读写、异常处理与数据类型映射。示例代码基于 .NET 6.0。 1. 准备环境 确保 TDengine TSDB 服务端可访问。原生连接使用 serverPort&#xff08;默认 6030&#xff09;。WebSocket 连接…

作者头像 李华
网站建设 2026/9/22 10:26:55

Java毕设项目推荐-基于springboot的学车超能驾校线上学习管理系统学车预约、考试信息、考试预约、考试成绩、课时充值的设计与实现【附源码+文档,调试定制服务】

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

作者头像 李华
网站建设 2026/9/21 23:03:05

day137—链表—删除链表中的结点(LeetCode-237)

题目描述有一个单链表的 head&#xff0c;我们想删除它其中的一个节点 node。给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。链表的所有值都是 唯一的&#xff0c;并且保证给定的节点 node 不是链表中的最后一个节点。删除给定的节点。注意&#xff0c;删除节…

作者头像 李华
网站建设 2026/9/23 11:14:26

Java毕设选题推荐:基于vue的博客分享发布系统基于springboot的博客系统【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华
网站建设 2026/9/20 15:55:27

【计算机毕业设计案例】基于python-CNN卷神经网络训练识别手势方向

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

作者头像 李华
网站建设 2026/9/20 16:03:49

ASCOMP PC Internals Pro(系统分析与硬盘监控)

链接&#xff1a;https://pan.quark.cn/s/b7f174263e7cASCOMP PC Internals Pro是一款专业级 Windows 系统分析与硬盘监控工具。该软件适用于个人用户、IT 专业人士以及注重系统透明度、早期故障检测和数据安全的零售商。通过一键操作&#xff0c;用户即可获取处理器、内存、显…

作者头像 李华