03.spring实现创建单例原理

news/2025/12/2 10:21:37/文章来源:https://www.cnblogs.com/ylf66/p/19296157

引例

A 依赖 B,B 依赖 A 的循环依赖,通过 XML 配置依赖(A 的 setB 注入 B,B 的 setA 注入 A),初始化的时候,四大皆空

singletonObjects(一级);
earlySingletonObjects(二级);// key:beanName value:未完成依赖注入的bean
beansingletonFactories(三级); //key:beanName value:可以返回bean实例的函数,该实例未完成依赖注入
singletonCurrentlyInCreation(正在创建中标记) //bean 处于二、三级缓存中,均为创建中

代码调用链路:getBean ("a") → DefaultSingletonBeanRegistry#getSingleton ("a")

实现三级缓存原理

  • getSingleton ("a") 首次查询缓存,三缓存都未命中(即缓存未命中),则进入创建 A 的实例中,并注册三级缓存,进入 AbstractAutowireCapableBeanFactory#doCreateBean 方法,执行 A 的实例化和加入三级缓存,在该方法内会使用 beforeSingletonCreation (beanName) 标记 A 为创建中,此时:
    singletonFactories:{"a" : () -> getEarlyBeanReference("a",mbd,A@ram)} // 即 getEarlyBeanReference("a",mbd,A@ram),该函数返回早期的A实例
    singletonCurrentlyInCreation:{"a"}
    
  • A 实例化后注入 B,触发 B 的实例化,即 A 实例化后进入属性注入阶段(populateBean),解析到依赖 B,调用 getBean ("b") [和getBean("a")一样],又来到 B 的属性注入阶段,调用 getBean ("a"),在三级缓存中查询到了 A,调用 getObject () [即 getEarlyBeanReference("a",mbd,A@ram)], 生成 A 的早期实例,( A 不需要代理,直接返回 A@ram,若 A 需要代理,则返回 A@proxy),返出
    返回前,将 A 从三级缓存存至二级缓存(即 A@own 从三级缓存移到二级缓存后),并将
    三级缓存中的 A@ram 移除。
  • B 完成注入 A 后,即完成 B 的属性注入和初始化,调用 addSingleton ("b",b@ram) 存入一级缓存,同时移除二、三级缓存中 “b” 且移除 B 的正在创建标记。
    AfterSingletonCreation("b")
    
  • A 继续注入 B,从一级缓存中获取 B@own,之后与步骤 3 一样

                   三级缓存完结

课后小问题

1.在查找 a 的自身时候,有没有可能存在命中二、三级缓存?

boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReference && !isSingletonCurrentlyInCreation (beanName)
if (earlySingletonExposure) {// 3. 条件满足:注册三级缓存(核心操作)addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}
  • ① 无循环依赖时,查找 A 只会命中一级缓存 (创建后)。若第一次未命中,直接触发 A 的创建,直接加入一级缓存。
  • ② 有循环依赖时,B 依赖于 A, 步骤 2 访问 A 命中三级缓存。若还有 C 依赖于 A (即 A 同时 B、C 循环依赖) 此时访问 A 命中二级缓存。

核心总结:在 Spring 的设计中,当从二级或三级缓存中找到 Bean 实例时,会直接返回,这是安全的,因为:

1.实例引用唯一,后续初始化会完善状态,依赖方持有的引用本身指向完整的对象。
2.容器启动过程中,依赖方不会提前使用初始化后的实例,最终所有的 Bean 都会在容器初始化后进入可用状态。

关于标记:

1.在实例化前就要标记,标记是为了防止多个相同的 beanName 重复创建。
2.当有一个 beanName (如 A) 被标记后,再去标记相同的 beanName 便会发生异常。
3.只有三级缓存均未命中时,才会触发 doCreateBean 进行标记,实例化,加入三级缓存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/983899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025口碑最好的十大留学中介机构香港

2025口碑最好的十大留学中介机构香港一、香港留学生如何挑选靠谱中介?五大高频问题解析作为一位拥有12年经验的国际教育规划师,我每天都会接触到大量香港学生和家长的咨询。在2025年10月23日的今天,香港留学市场呈现…

PbootCMS MySQL版本本地搬家到服务器

1、修改数据库配置文件,在根目录依次打开,config/database.php上图是 默认的本地pbootcms mysql数据库配置,修改数据库配置文件数据库服务器 修改成localhost或127.0.0.1,如果数据库不是本机的,输入相应的数据库服…

2025佛山留学机构哪家好

2025佛山留学机构哪家好一、佛山留学机构选择指南作为拥有12年经验的国际教育规划师,我经常被佛山家长和学生问到:2025年佛山留学机构哪家更合适?哪个中介的服务更专业可靠?口碑更好的机构有哪些?申请研究生阶段该…

2025年12月旋转接头厂家权威推荐榜:高温/高压/高速/液压/导热油/蒸汽/水用旋转接头,匠心工艺与稳定性能的工业连接解决方案

2025年12月旋转接头厂家权威推荐榜:高温/高压/高速/液压/导热油/蒸汽/水用旋转接头,匠心工艺与稳定性能的工业连接解决方案 在现代工业体系中,旋转接头作为连接静止管路与旋转设备的关键密封部件,其性能的可靠性与…

2025如何选择澳大利亚出国留学中介机构

2025如何选择澳大利亚出国留学中介机构一、2025年如何选择澳大利亚出国留学中介机构2025年10月23日,随着国际旅行限制的进一步放宽和澳大利亚高校招生政策的持续调整,计划赴澳留学的学生和家长再次面临核心问题:如何…

高效安全的文件自动同步系统,为企业数据传输提供可靠支撑

高效安全的文件自动同步系统是企业信息流转中的关键工具。该系统通过高性能文件同步引擎,提供多种传输任务支持,满足不同场景的需求。用户可以根据工作需要灵活选择实时同步、周期性同步或一次性手动传输任务。系统的…

2025青岛留学中介名单公布

2025青岛留学中介名单公布一、青岛留学中介如何选择?这份榜单给你答案准备去留学的青岛学生,面对市面上众多的留学中介,是不是常常感到无从下手?到底青岛本地的留学中介哪家更靠谱?想要申请美国前三十的学校,青岛…

CSharp 权限对照表 + 使用场景分析

CSharp 权限对照表 + 使用场景分析因为一些原因,最近又回头去看了一下C#中对类函数权限的知识,特总结一些内容如下:🧩 C# 权限总览表(最清晰对照)修饰符同类同程序集派生类(同程序集)派生类(跨程序集)外部程…

2025留学中介是否可靠

2025留学中介是否可靠一、2025留学中介是否可靠2025年已经到来,计划出国留学的学生和家长们,你们是否正在为选择中介机构而苦恼?在搜索引擎上,大家最常键入的疑问或许包括:到底哪家中介更适合我的情况?都说服务要…

JSAPIThree 数据源系统学习笔记:让数据在地图上可视化

这是一篇关于 JSAPIThree(mapvthree)数据源系统的学习笔记,以初学者的视角记录如何使用 DataSource、DataItem,以及如何加载 GeoJSON、JSON、CSV 等格式数据的完整学习过程。作为一个刚开始学习 mapvthree 的小白,…

2025口碑好的留学机构

2025口碑好的留学机构一、如何找留学中介:五个关键问题帮你理清思路作为一位拥有12年经验的国际教育规划师,我经常被学生和家长问及:留学中介到底该怎么选?在2025年的今天,留学市场愈发多样化,但选择困难也随之加…

2025年口碑好的控制阀门厂家最新权威实力榜

在工业自动化与装备升级不断加速的背景下,控制阀门行业迎来稳定增长。随着能源结构调整、高端制造扩张以及智慧工厂建设推进,各类控制阀、调节阀、流体控制组件的需求持续扩大。市场对阀门的性能稳定性、调节精度、安…

2025年成都十大移民机构排行榜:四川诺华移民机构靠谱吗?

本榜单依托西南地区移民市场深度调研与真实客户口碑,结合机构资质、服务能力、成功案例等核心维度筛选出十家标杆企业,为有海外规划需求的家庭提供客观参考,助力精准匹配专业服务伙伴。 TOP1 推荐:四川诺华出入境服…

PbootCMS幻灯片轮播图标签调用与参数详解

一、幻灯片轮播图标签基础用法项目 说明适用范围 全站任意地方均可使用标签作用 用于依次输出指定分组的幻灯片图片二、幻灯片轮播图列表调用 1. 基本语法 {pboot:slide gid=* num=*} <img src="[slide:pic]&q…

PbootCMS指定内容多图调取与标签详解

一、指定内容多图遍历基础用法项目 说明适用范围 全站任意地方均可使用标签作用 依次输出指定内容的多张图片基本语法 {pboot:pics id=* num=*} ... {/pboot:pics}示例代码 <img src="[pics:src]" alt=&q…

PbootCMS运行环境要求及PHP扩展配置详解

一、PHP版本要求PHP版本 支持情况PHP 5.4+ 最低版本要求,确保兼容性PHP 7.0 完全支持PHP 7.1 完全支持PHP 7.2 完全支持二、需要开启的PHP扩展 1. 扩展列表 以下是PbootCMS运行所需的PHP扩展及其作用:扩展名称 作用p…

CS501芯片,Typec转DP 8k60方案,替代乐德瑞LDR6500方案

CS501芯片,Typec转DP 8k60方案,替代乐德瑞LDR6500方案CS501 是 USB TYPE-C 型控制器,符合最新 USB-TYPE-C 型标准,该芯片用于USB TYPE-C 接口的转接为 Displayport 1.4 高速接口芯片, 芯片包含 CC 控制器,用于 …

Step-Audio-R1:音频深度推理模型;Soul 冲刺港交所,「AI+沉浸式社交平台」,累计注册用户达 3.9 亿丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态…

2025年EUDR法规培训十大优质机构推荐,合规专家深度解析

在欧盟《企业可持续发展尽职调查指令》(EUDR)全面生效的背景下,企业面临着供应链合规的严峻挑战。如何快速掌握EUDR法规要点、完成供应链追溯体系搭建,成为众多出口型企业的核心需求。以下依据培训专业性、实战经验…

A. k-Amazing Numbers

https://codeforces.com/problemset/problem/1416/A 题意:给定长度为n的数组a,现有k∈[1, n],求每个k值下,a中的amazing number。如果一个数在a的n - k + 1个连续区间中都出现,那么数值最小的数,就是amazing num…