面试题之spring源码

news2024/10/6 12:32:36

IOC的底层原理 :

Spring是如何循环依赖的。(三级缓存,提前曝光):

循环依赖的定义:循环依赖就是循环引用,也就是两个或两个以上bean对象互相持有对方,最终形成闭环,比如A依赖B,B依赖C,C依赖A,形式循环依赖。

第一级缓存SingletoObjects:也叫单例池,存放已经经历了完整生命周期的Bean对象。(已经实例化和初始化)(最终完整结果的对象)

第二级缓存earlySingletoObjects:存放早期暴露出来的Bean对象,实例化以后,就把对象放到这个Map中。(Bean可能只经过实例化,属性还未填充,可以理解为已经是实例化,但未初始化)。(l理解为对象相互移动的中转站)

第三级缓存singletonFactories:存放早期暴露的Bean的工厂。(理解为存放的是提前暴露的实例)

Spring单列对象初始化步奏:

createBeanInstances实例化:调用对象的构造方法实例化对象。

populateBean属性填充:主要对应Bean的依赖属性进行填充

initalizeBean:调用applionContext.xml中的init初始化方法

A依赖B,B依赖A

1、首先 A 完成初始化第一步并将自己提前曝光出来(通过 ObjectFactory 将自己提前曝光),于是先将A放到三级缓存,去实例化B。

2、然后就走B创建的过程,B初始化的过程中发现需要A,于是B先查一级缓存寻找A,如果没有,再查二级缓存,如果还没有,再查三级缓存,找到了A,可以通过 ObjectFactory#getObject() 方法来拿到 A 对象,然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A。(可以理解为将A从三级缓存剪切到二级缓存中)

3、B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中的状态)。然后回来接着创建A,此时B已经创建结束,可以直接从一级缓存里面拿到B,去完成A的创建,并将A放到一级缓存。

关键字:三级缓存,提前曝光。

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

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

相关文章

文件夹加密软件怎么选?文件夹加密软件盘点

文件夹是电脑储存数据的重要工具,那么该如何保护文件夹的数据安全呢?使用合适的文件夹加密软件可能是最简单的方法。那么文件夹加密软件该怎么选呢? 文件夹加密超级大师 文件夹加密超级大师可以说是最全能的文件夹加密软件,它拥有…

自己编写chrome插件

1.首先你需要一个menifest.json文件 {"manifest_version": 3,"name": "My Extension","version": "2.0","action": {"default_popup": "popup.html","default_icon": "icon.…

winform弹出消息自动消失

winform弹出消息自动消失 弹出消息后,在指定时间毫秒后消失.消息中包含异常消息,自动一直展示,点击关闭显示; 效果如图 using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks;usi…

保姆级系列教程-玩转Fiddler抓包教程(1)-HTTP和HTTPS基础知识

1.简介 有的小伙伴或者童鞋们可能会好奇地问,不是讲解和分享抓包工具了怎么这里开始讲解HTTP和HTTPS协议了。这是因为你对HTTP协议越了解,你就能越掌握Fiddler的使用方法,反过来你越使用Fiddler,就越能帮助你了解HTTP协议。 Fid…

全网最全,项目管理工具大合集!

早上好,我是老原。 很久没给大家更新工具,本以为之前更新的也够大家用了,没想到还是有很多小友来私信老原好用工具。 关注我比较久的粉丝都知道,我提倡的工具在精不在多,更多的把精力放在自身上,还有啥不…

Vue使用百度地图API详细教程

Vue使用百度地图详细教程 先提供几个文档 Vue-Baidu-map文档:https://dafrok.github.io/vue-baidu-map/#/zh/index 百度地图JavaScript文档:https://lbsyun.baidu.com/index.php?titlejspopularGL 1、申请百度API密钥 控制台->应用管理->我的应…

博途字符串和FIFO编程应用(SCL源代码)

FIFO的其它介绍请参看下面文章链接: PLC堆栈(FIFO)操作之栈级联_三菱plc控制系统的堆栈的工作原理_RXXW_Dor的博客-CSDN博客这篇博文主要讲下各种缓存栈的级联,提供一个分析问题的扩展思路,这个级联什么时候适合在项目里使用需要具体分析。级联实现数据队列的一级级递推传送…

Redis 安装

目录 1、准备安装环境 2、上传安装文件 3、解压安装文件 4、进入安装目录 5、运行编译命令 6、前台启动 ​编辑7、后台启动 8、验证服务 9、关闭服务 10、开启启动 1、准备安装环境 由于 Redis 是基于 C 语言编写的,因此首先需要安装 Redis 所需要的依赖…

Python(一):为什么我们要学习Python?

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

星辰天合受邀参加 2023 全球数字经济大会

7 月 4 日至 7 日,以“数据驱动发展,智能引领未来”为主题的2023全球数字经济大会在北京隆重举办。作为国内技术领先的数据基础设施提供商,星辰天合以北京优秀信创企业代表的身份,受北京信息化协会邀请,参加了 2023 全…

ICC2:copy block方法

open_lib new.nlib open_lib old_lib copy_block -from_block old_block -to_block new.nlib:old_block save_lib new.nlib close_lib 如果是从同一个lib下的block copy到同个lib里,那就open_lib后直接copy就好了,操作时用current_block new_name_b…

多元回归预测 | Matlab基于高斯过程回归(GPR)的数据回归预测,matlab代码,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于高斯过程回归(GPR)的数据回归预测,matlab代码,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码

STM32 Proteus仿真LCD12864俄罗斯方块-FZ0063

STM32 Proteus仿真LCD12864俄罗斯方块-FZ0063 Proteus仿真小实验: STM32 Proteus仿真LCD12864俄罗斯方块-FZ0063 功能: 硬件组成:STM32F103R6单片机 LCD12864显示器多个按键 1.标准俄罗斯方块经典游戏玩法,带计时&#xff0c…

计数排序 (Counting Sort)_20230709

计数排序(Counting Sort) 前言 计数排序的对象一般为分布在[0-k]范围内的非负整数,计数器类似哈希函数的线性映射,它确定了数值本身和它在序列中的总数量之间的基本关系。它的本质是计算某个数在临时序列中(原序列大小相同,但下…

零售业未来如何破局?抓住数智化经营的两把利刃!

导语 | 数字化转型浪潮席卷了千行百业,有人从中看出了汹涌的挑战,也有人从中嗅出了美妙的商机。对于零售企业而言,当前数智经营进入了哪个阶段?未来的破局之道又在何方?我们邀请到了广东省 CIO 协会消费品与零售行业分…

API接口知识小结(电商API接入)

应用程序接口API(Application Programming Interface),是提供特定业务输出能力、连接不同系统的一种约定。这里包括外部系统与提供服务的系统(中后台系统)或后台不同系统之间的交互点。包括外部接口、内部接口&#xf…

Redis专题学习(一)Redis核心数据结构实战与高性能原理剖析

redis是key-value的存储格式, key是string类型的, value可以有五种基本的数据结构:string、hash、list、set、zset 来看看 这5中基本数据类型的基本使用和应用 一.字符串string string是最常见和最基本的数据结构 基本使用: …

leetcode 501. 二叉搜索树中的众数

2023.7.10 这道题我的思路是适用于任意二叉树的思路&#xff1a; 先用任意一个遍历方法将节点保存至map<int,int>中&#xff0c;key为节点值&#xff0c;value为频率。由于map没有对value&#xff08;频率&#xff09;排序的方法&#xff0c;所以将map的键值对转移至vec…

TCP协议三次握手的抓包模拟

三次握手(Three-way Handshake)&#xff0c;是指建立一个 TCP 连接时&#xff0c;需要客户端和服务器总共发送3个包。 第一次握手([SYN], Seq x) 客户端发送一个SYN标记的包&#xff0c;Seq初始序列号x&#xff0c;发送完成后客户端进入SYN_SEND状态。 第二次握手([SYN,ACK]…

一个面试知识点: CreateThread() 与 _beginthread() 的区别

如题: 像现在有c11, 加上不写原生winApi 很久没有用这俩玩意了, 真的忘记了, 被问到这个的时候, 我还清晰记得之前在WPS里的时候专门了解这个 CreateThread的简单用法贴下面了 c win32API 【CreateThread】创建线程 其实就简单的记住 1._beginthread 底层还是 调用的 Creat…