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

Spring解决循环依赖其实就用了个递归

本文用简要代码事例解释了Spring如何能解决依赖循环,并不讨论实际源码涉及的诸多因数,比如为什么有3个集合。

重点:

1、用3个集合来解决循环依赖,需要清楚3个集合分别是存什么

2开始条件:使用 Supplier 来延迟 Bean 的创建,确保只有在需要时才创建 Bean。看下

代码中private Map<String, Supplier<?>> singletonFactories = new HashMap<>();

3查找顺序,①先从singletonObjects 找,②找不到再从earlySingletonObjects找,③再找不到从singletonFactories创建并放到earlySingletonObjects中。假设这个方法叫getBean。

4从singletonFactories创建的时候遇到依赖会调用getBean获取,这相当于递归过程。当遇到依赖循环的时候,递归会在调用步骤②的时候结束。相当于结束条件。

模拟代码:

import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;class A {private B b;public void setB(B b) {this.b = b;}@Overridepublic String toString() {return "A{" +"b=" + (b != null ? "B" : "null") +'}';}
}class B {private A a;public void setA(A a) {this.a = a;}@Overridepublic String toString() {return "B{" +"a=" + (a != null ? "A" : "null") +'}';}
}public class CircularDependencyDemo {private Map<String, Object> singletonObjects = new HashMap<>();private Map<String, Object> earlySingletonObjects = new HashMap<>();private Map<String, Supplier<?>> singletonFactories = new HashMap<>();public static void main(String[] args) {CircularDependencyDemo demo = new CircularDependencyDemo();demo.resolveCircularDependency();}public void resolveCircularDependency() {//创建 A 的工厂并放入 singletonFactoriessingletonFactories.put("a", () -> {A a = new A();earlySingletonObjects.put("a", a);//初始化 A 时发现需要 Ba.setB(getBean("b"));return a;});//创建 B 的工厂并放入 singletonFactoriessingletonFactories.put("b", () -> {B b = new B();earlySingletonObjects.put("b", b);//初始化 B 时发现需要 Ab.setA(getBean("a"));return b;});//初始化 A 和 BA a = getBean("a");B b = getBean("b");//完成初始化后将 A 和 B 移动到 singletonObjectssingletonObjects.put("a", a);singletonObjects.put("b", b);System.out.println(singletonObjects.get("a"));System.out.println(singletonObjects.get("b"));}//查找顺序private <T> T getBean(String beanName) {if (singletonObjects.containsKey(beanName)) {return (T) singletonObjects.get(beanName);}if (earlySingletonObjects.containsKey(beanName)) {return (T) earlySingletonObjects.get(beanName);}if (singletonFactories.containsKey(beanName)) {Supplier<?> factory = singletonFactories.remove(beanName);T object = (T) factory.get();//这里隐藏着递归过程earlySingletonObjects.put(beanName, object);return object;}throw new RuntimeException("Bean not found: " + beanName);}
}

 

 

http://www.dtcms.com/a/574821.html

相关文章:

  • 成品网站管系统东莞想做网站
  • 重庆可做网站 APP租用服务器做视频网站
  • 全自动削皮机方案,果蔬去皮机/削皮机MCU控制方案开发设计
  • 北京价格微网站建设茶叶价格网站建设
  • Rust 练习册 2:深入理解 Cell
  • 龙华做网站西安微网站开发
  • 国外有网站备案制度吗制作视频网站建设
  • 创建本地网站站酷设计官方网站
  • LeetCode 416 - 分割等和子集
  • 网站开发命名规范iis创建网站
  • 物流公司网站 源码开发区邮编
  • 做网站需要给设计提供网络营销策划是什么
  • 香港科技大学广州|智能交通学域博士招生宣讲会—湖南大学专场
  • 哪家网站开发好wordpress 禁止头像
  • 淘宝网站开发网站开发恶意索赔
  • Python+Requests零基础系统掌握接口自动化测试
  • 建设网站的硬件影视公司简介
  • 北京网站建设seo公司哪家好免费做字体的网站好
  • 淘宝客网站搭建教程能推广的平台有哪些
  • 坪地网站建设如何wordpress博客下载插件
  • 做外贸要访问国外的网站怎么办携程网网站是哪家公司做的
  • dz网站模板新河网新河吧
  • Ubuntu22.04 ros2-humble 源码安装 Moveit2
  • 网站开发需求表模板制作小企业网站
  • 南宁公司做网站佛山企业网站建设渠道
  • 从山海经取公司名三个字无锡优化网站排名
  • 旅游网站系统设计wordpress多重搜索
  • php快速建站系统广西建设网登录入口
  • 高端网站开发案例展示做网站傻瓜
  • 于丹确认出席创客匠人 2025 峰会:AI 时代,用人文为技术与 IP 注入灵魂