news 2026/5/1 9:37:51

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/5/1 9:37:49

亲测好用!专科生毕业论文TOP8 AI论文网站测评

亲测好用&#xff01;专科生毕业论文TOP8 AI论文网站测评 2026年专科生毕业论文AI工具测评&#xff1a;为何值得一看 随着人工智能技术的不断进步&#xff0c;越来越多的专科生开始借助AI工具辅助完成毕业论文写作。然而&#xff0c;面对市场上琳琅满目的AI论文网站&#xff0c…

作者头像 李华
网站建设 2026/4/21 8:48:19

基于微信小程序的日语学习系统【源码+文档+调试】

&#x1f525;&#x1f525;作者&#xff1a; 米罗老师 &#x1f525;&#x1f525;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f525;&#x1f525;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#…

作者头像 李华
网站建设 2026/5/1 9:37:48

基于微信小程序的音乐室预约系统【源码+文档+调试】

&#x1f525;&#x1f525;作者&#xff1a; 米罗老师 &#x1f525;&#x1f525;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f525;&#x1f525;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#…

作者头像 李华
网站建设 2026/4/22 10:08:40

QT跨平台一次编写,处处编译

在当今软件开发领域&#xff0c;“跨平台”已从一个技术理想转变为实际需求。当我们谈论跨平台框架时&#xff0c;QT无疑是其中最耀眼的名字之一。但QT究竟如何实现“一次编写&#xff0c;到处运行”的承诺&#xff1f;它的跨平台本质是什么&#xff1f; 抽象的艺术&#xff1a…

作者头像 李华
网站建设 2026/4/30 11:30:36

即插即用系列(代码实践)专栏介绍

把论文&#xff0c;真正变成你能直接用的代码 写在前面&#xff1a; 这篇文章不是为了“卖课”&#xff0c;而是想认真解释一件事—— 为什么我会花大量时间&#xff0c;把顶会论文拆成即插即用的代码模块。 如果你正好也在做科研、写论文、改网络结构&#xff0c;希望这篇文章…

作者头像 李华