当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/259760/

相关文章:

  • Java计算机毕设之基于springboot的旅行智能推荐、行程规划、活动管理指南系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 【毕业设计】基于springboot的宠物医院管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • ssm490王道考研课程资料购物网站--论文
  • mysql系统级文件损坏修复
  • ssm491网上订餐系统09hbt--论文
  • 【毕业设计】基于springboot的旅行指南系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • java-SSM335的数字工坊课程教学笔记商城网站-springboot
  • 3.JDK动态代理和CGLib动态代理实现原理和两者的区别
  • 【课程设计/毕业设计】基于springboot的旅行指南系统整合目的地攻略、行程规划、景点推荐、美食住宿查询、旅行日记分享的设计与实现【附源码、数据库、万字文档】
  • 4.Mybatis中#{}和${}的区别是什么?
  • Java毕设项目推荐-基于springboot的宠物医院宠物信息、医疗服务管理系统的设计与实现【附源码+文档,调试定制服务】
  • ssm649网上书城图书销售商城vue带商家
  • php mongodb扩展
  • ssm645考试系统学生教师管理员vue
  • ssm650springboot高校党员党建党务系统vue
  • 【计算机毕业设计案例】基于springboot的宠物医院中小型宠物医院、连锁宠物诊疗机构管理系统的设计与实现(程序+文档+讲解+定制)
  • Android设备与Mac/Docker全连接指南:有线到无线的完整方案
  • 亲测好用!专科生毕业论文TOP8 AI论文网站测评
  • 解码MQTT协议与DHT11传感器
  • 基于微信小程序的日语学习系统【源码+文档+调试】
  • 基于微信小程序的音乐室预约系统【源码+文档+调试】
  • java-SSM329的四六级英语报名系统-springboot
  • 【课程设计/毕业设计】基于springboot宠物医院智能管理系统基于springboot的宠物医院管理系统的设计与实现【附源码、数据库、万字文档】
  • Lex和Yacc(1) 入门
  • 2026 年机场广告投放公司综合实力排行榜单及选择建议指南:2026年机场广告投放公司如何选?哪家好?哪家靠谱?选哪家? - Top品牌推荐
  • Day21-20260117
  • Java计算机毕设之基于springboot的宠物医院就医预约管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 计算机Java毕设实战-基于springboot+vue的宠物医院管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • QtOpenGL多线程渲染方案深度解析
  • Java毕设选题推荐:基于Java+springboot的宠物医院管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】