三、Spring源码-实例化

news2024/11/26 3:48:45

Spring源码-Bean的实例化

  接下来我们看看Bean的实例化处理

一、BeanDefinition

  首先我们来看看BeanDefinition的存放位置。因为Bean对象的实例化肯定是BeanFactory基于对应的BeanDefinition的定义来实现的,所以在这个过程中BeanDefinition是非常重要的,前面的课程讲解已经完成了BeanDefinition的定义。同时根据前面refresh方法的讲解我们知道了BeanFactory的具体实现是 DefaultListableBeanFactory.所以BeanDefinition的相关信息是存储在 DefaultListableBeanFactory的相关属性中的。

/** Map of bean definition objects, keyed by bean name. */
private final Map<String, BeanDefinition> beanDefinitionMap = new
ConcurrentHashMap<>(256);

二、Bean实例的创建过程

  然后就是Bean实例的创建过程。这块儿我们可以通过Debug的形式非常直观的看到。

image.png

  按照这种步骤一个个去分析就OK了。

三、单例对象

  在创建单例对象的时候是如何保存单例的特性的?这块我们需要注意下面的代码

image.png

然后进入到getSingleton方法中。

image.png

创建成功的单例对象会被缓存起来。在 addSingleton 方法中

image.png

image.png

所以singletonObjects是缓存所有Bean实例的容器

image.png

而具体创建单例Bean的逻辑会回调前面的Lambda表达式中的createBean方法

image.png

image.png

四、单例对象的销毁

  然后我们先来看下一个单例Bean对象的销毁过程。定义一个案例

image.png

然后我们在测试的案例中显示的调用 close方法

image.png

执行的时候可以看到相关的日志执行了。

image.png

进入到close方法中分析,比较核心的有两个位置。在doClose方法中。

image.png

具体销毁的代码进入destroyBeans()中查看即可。

在doClose方法中有个提示。registerShutdownHook方法

image.png

	@Override
	public void registerShutdownHook() {
		if (this.shutdownHook == null) {
			// No shutdown hook registered yet.
			this.shutdownHook = new Thread(SHUTDOWN_HOOK_THREAD_NAME) {
				@Override
				public void run() {
					synchronized (startupShutdownMonitor) {
						doClose();
					}
				}
			};
			Runtime.getRuntime().addShutdownHook(this.shutdownHook);
		}
	}

对应的在web项目中就有对应的调用

image.png

这个就是Bean实例化的过程了,当然在实例化中的DI问题我们在下篇文章中重点分析。

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

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

相关文章

QGraphicsView基本初识别

拖拽如下控件&#xff1a; 然后实现效果&#xff1a; 圆形和矩形都可以移动&#xff0c;矩形、圆形就是图元&#xff0c;而图元放在我们创建的场景中&#xff0c;场景又透过多个视图来看到&#xff0c;其实可以理解成很多人偷窥你在吃饭的这个场景&#xff0c;饭和你这些角色…

使用UltraISO制作麒麟v10系统盘

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录 1 背景2 准备工作2.1 镜像准备2.2 制作工具2.3 启动U盘 3 制作步骤3.1 找到ISO文件&#xff0c;右…

ThingsKit物联网平台可视化之用户权限说明

角色设计 角色设计是软件设计中的一个重要环节&#xff0c;它决定了用户在软件系统中的使用体验和交互方式。在本系统中包含四类角色&#xff0c;分别是&#xff1a;超级管理员、平台管理员、租户、客户。以下是对应角色的关系及相关说明。 角色关系 角色说明 角色名称描述超…

css实现水平居中

代码示例 <div class"box"><div class"box1"></div> </div>1.弹性布局&#xff1a;&#xff08;推荐&#xff09; display:flex&#xff1b; 这些要添加在父级的&#xff0c;是父级的属性 //父级添加display:flex; //父级添加jus…

Django Rest_Framework(一)

1. Web应用模式 在开发Web应用中&#xff0c;有两种应用模式&#xff1a; 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。] 前后端分离【把前端的界面效果(html&#xff0c;css&#xff0c;js分离到另一个服务端或另一个目录下&#xff0c;python服务…

英语翻译日语翻译待遇哪个好

如今&#xff0c;随着世界联系越来越紧密&#xff0c;市场上对于翻译业务的需求也越来越大。那么&#xff0c;针对比较热门的英语翻译与日语翻译&#xff0c;哪个语言翻译待遇好&#xff1f; 我们知道&#xff0c;英语作为全球使用频率最高的语言&#xff0c;业务量大市场需求大…

Selenium 无头浏览器被知乎限制访问的解决方案

问题出现 我尝试使用如下代码爬取知乎的有关内容&#xff0c;出现知乎安全验证界面&#xff1a; def init_driver():options Options()options.add_argument("--headless")options.add_argument(--disable-gpu)driver webdriver.Chrome(optionsoptions)return dr…

Wi-Fi 6技术详解

1. 介绍 Wi-Fi 6&#xff0c;也称为802.11ax&#xff0c;是Wi-Fi技术的最新标准。它是对之前标准Wi-Fi 5&#xff08;802.11ac&#xff09;的升级和改进&#xff0c;旨在提供更高的速度、更大的容量、更好的性能和更高的可靠性。Wi-Fi 6技术的引入为无线网络带来了革命性的变化…

移远通信首批加入“5G+eSIM计算终端产业合作计划”,助力大屏移动终端全时在线

7月29日&#xff0c;在全球数字娱乐产业盛会 ChinaJoy上&#xff0c;中国联通携手高通公司、GSMA发布了“5GeSIM 计算终端产业合作计划”。 作为全球领先的物联网整体解决方案供应商&#xff0c;移远通信首批加入该计划&#xff0c;副总经理刘明辉受邀参加5GeSIM 计算终端产业合…

JavaScript创建,写入,复制,读取文件 只限IE ActiveX控件

最近接到需求&#xff0c;需要纯前端&#xff0c; 操作写入改变文件&#xff0c;一时间头大不已&#xff0c;还好此需求只需要屏幕展示&#xff0c;无需顾及兼容问题&#xff0c;找来找去找到了new ActiveXObject(“Scripting.FileSystemObject”) 强大控件 以下为自己记录的 …

安装nvm使用nvm管理node切换npm镜像后使用vue ui管理构建项目成功

如果安装nvm前已经单独安装过node.js的请先自行卸载原有node和环境变量里面的配置&#xff1b; 亲测成功&#xff0c;有哪些问题可以在评论区发消息或者私聊我 1、安装nvm的步骤如下 下载nvm安装包 在nvm的GitHub仓库&#xff0c;如下是国内镜像仓库&#xff1a; 点击这里跳…

心法利器[93] | 谈校招:技术面

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会&#xff0c;与大家一起成长。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2022年新一版的文章合集已经发布&#xff0c;累计已经60w字了&#xff0c;获取方式看这里&…

Open vSwitch(OVS虚拟交换机)

Open vSwitch&#xff08;OVS&#xff09; Open vSwitch&#xff08;OVS&#xff09;是一个开源的多层虚拟交换机&#xff0c;用于构建和管理软件定义网络&#xff08;Software-Defined Networking&#xff0c;SDN&#xff09;环境。它提供了一种灵活、可扩展的网络虚拟化解决…

单硬盘笔记本系统无损迁移(Ghost)方法

有一台笔记本启动使用UEFI方式&#xff0c;由于硬盘&#xff08;SSD&#xff09;发热问题想更换另一块SSD硬盘&#xff0c;但是由于笔记本就一个m.2接口&#xff0c;没有办法直接进行两块硬盘的系统迁移。 解决办法: 1、将老硬盘的系统通过Ghost软件克隆成一个gho文件&#x…

【MybBatis高级篇】MyBatis 拦截器

【MybBatis高级篇】MyBatis 拦截器 拦截器介绍实现拦截器注册拦截器应用ymlDynamicSqlDao 层代码xml启动类拦截器核心代码代码测试 拦截器应用场景 MyBatis 是一个流行的 Java 持久层框架&#xff0c;它提供了灵活的 SQL 映射和执行功能。有时候我们可能需要在运行时动态地修改…

如何解决 Scratch 中很难去除的bug?

大家好&#xff0c;今天我们就来讲讲我们在使用Scratch编程中遇到的一些典型的bug&#xff0c;相信也有你遇到的&#xff0c;我这里讲的名称稍微专业了一点&#xff0c;但是也希望你都能看完整篇文章&#xff0c;说不定就有你遇到的&#xff0c;给作者一个关注和赞吧&#xff0…

Vue如何做一个左边栏

要求一-------点击之后能够实现页面跳转,使用router&#xff0c;点击之后跳到指定页面&#xff1a; 第二步&#xff1a;如何实现简易的前端路由 第三步 左侧边栏的正确写法&#xff0c;ul中li套router-link 第四步 实现嵌套路由 第五步 ul中嵌套着li 第六步嵌套路由 第七步&…

elementUI 实现动态表单数据校验

转载http://t.csdn.cn/XuTa2 1、探讨需求 首先我们需要探讨一下需求&#xff1a; 表单中的部分el-form-item 的label都是从接口拿到的&#xff0c;需要遍历进行动态渲染。 需要给每个el-form-item加上校验至少是必填校验 有的el-form-item不需要校验&#xff0c;也不是从接口…

express学习笔记1 - 框架搭建

1、创建项目 mkdir admin-node cd admin-node npm init -y 安装依赖 npm i -S express 创建 app.js const express require(express)// 创建 express 应用 const app express()// 监听 / 路径的 get 请求 app.get(/, function(req, res) {res.send(hello node) })// 使 …

GoogleLeNet Inception V2 V3

文章目录 卷积核分解第一步分解&#xff0c;对称分解第二步分解&#xff0c;非对称分解在Inception中的改造一般模型的参数节省量可能导致的问题 针对两个辅助分类起的改造特征图尺寸缩减Model Regularization via Label Smoothing——LSR问题描述&#xff0c;也就是LSR解决什么…