XML创建IOC容器的过程

news2024/11/17 1:32:31

Spring框架的核心之一是IOC,那么我们是怎么创建出来的Bean呢?
作者进行了简单的总结,希望能对你有所帮助。

IOC的创建并不是通过new而是利用了java的反射机制,利用了newInstance方法进行的创建对象。

首先,我们先定义一个类,叫PropertyValue,这个里面封装了name,ref,value,就对应了我们在xml文件里的标签。

其次,我们需要定义BeanDefinition(这只是一个接口,里面有很多继承关系去实现了这个类,这里为了方便理解,不深入说了,就当他是一个类),其中包含了id,classname等等。
在这里插入图片描述

然后,是一个注册类,实现了BeanDefinitionRegistry这个接口。这个类中将所有从之后在这里插入图片描述
我们将读到xmL文件信息中的bean信息全部注册到了这个里面。

其次,是xmlRead类,我们通过读取xml文件,将所有的bean信息全部注册进去。这里有一个小细节,我们在注册时候用的是classLoader的getSourceasStream方法,这是为什么呢?我们直接使用文件读取不好吗,为什么读一个文件还要这么麻烦呢。使用类加载器的getResourcesAsStream方法可以使Spring不依赖文件操作系统的具体实现,从而可以简化跨操作系统的应用部署。这种方式使得Spring框架可以在不同的操作系统平台上运行,而不需要修改代码以适应不同的操作系统。当然这只是其中的原因之一。
在这里插入图片描述

接着,我们定义一个工厂类,这个类就是实例化我们对象的核心
我们看一下继承关系
在这里插入图片描述
在这里插入图片描述在xmlapplicationcontext中就实现了xml文件读取进行bean的实例化过程,这个过程我们通过new一个xml读取类,然后调用其中的方法进行注册容器。在getbean中,实现实例化。我们通过注册类拿到相关的信息,然后利用反射class.forname拿到反射的字节码文件,并利用newInstance方法对Bean实例化。然后我们需要对其进行赋值。那么我们就需要获得其中的初始化实例方法,这个实例化方法是怎么获得呢?
还记得在CGlib和JDK动态代理中我们一直提到的invoke方法嘛,它可以执行我们通过字节码获取的Method(它是Method中的一个核心方法,用于执行获取到的方法)。
我们通过字符串拼接,因为我们都是驼峰命名所以一定可以预先知道set方法长啥样,我们拼接处方法的名字
接着通过如下方式执行
Method method = clazz.getMethod(methodName, String.class);
method.invoke(beanObj,value);
最后返回return clazz.cast(bean)就OK啦
PS:Class.cast(Object obj)方法 就是作用就是强制类型转换。将obj转化成T类型。

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

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

相关文章

数智赋能 | 迅镭激光中标起重装备龙头株洲天桥起重!

工程机械是装备工业的重要组成部分,而作为工程机械最重要的产品体系之一的起重装备,在日新月异的城市化发展进程中,以效率高、性能强、智能化等特点迅速占领市场的一席之地。 在国家双碳目标下,国内起重装备产业正在加快向大型化、…

做亚马逊多久可以赚钱?做亚马逊需要多少资金?——站斧浏览器

做亚马逊需要时间、资金和全面的市场策略。创业者需要有耐心和决心,同时也要灵活应对市场变化。那么做亚马逊多久可以赚钱,做亚马逊需要多少资金。 做亚马逊多久可以赚钱 首先,就像任何其他生意一样,做亚马逊需要时间和努力来建立起稳定的客…

VUE限制文件上传大小和上传格式

<el-form-item label"图片&#xff1a;" prop"tempImagePath"><el-uploadclass"upload"accept"image/jpeg":show-file-list"false"list-type"picture-card":headers"{ token: token}":action&…

【分享】前后端分离框架的相关内容有哪些?

在当前&#xff0c;低代码技术平台的灵活性、可视性、高效性等优势特点在职场办公中非常亮眼&#xff0c;成为众多企业提升办公效率和有效利用数据资源的重要工具。为了迎合市场需求&#xff0c;前后端分离也成为了发展趋势&#xff0c;如果大家想了解前后端分离框架的具体内容…

保姆级连接FusionInsight MRS kerberos Hive

数新网络&#xff0c;让每个人享受数据的价值https://xie.infoq.cn/link?targethttps%3A%2F%2Fwww.datacyber.com%2F 概述 本文将介绍在华为云 FusionInsight MRS&#xff08;Managed Relational Service&#xff09;的Kerberos环境中&#xff0c;如何使用Java和DBeaver实现远…

JOSEF约瑟 瓦斯继电器(又称气体继电器) QJ4-25 250V 0.3A

QJ4系列气体继电器 QJ4-25气体继电器 QJ4-25瓦斯继电器 QJ4-25TH气体继电器 QJ4-25TH瓦斯继电器 QJ4G-25气体继电器 QJ4G-25瓦斯继电器 QJ4G-25TH气体继电器 QJ4G-25TH瓦斯继电器 用途 QJ4-25气体继电器是油浸式有载分接开关所用的一种保护装置。(体继电器安装在变压器箱盖 与…

KubeSphere 社区双周报 | Fluent Operator 2.6.0 发布 | 2023.11.10-11.23

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.11.10-2023.…

python之pyqt专栏2-项目文件解析

项目结构 在上一篇文章python之pyqt专栏1-环境搭建&#xff0c;创建新的pyqt项目&#xff0c;下面我们来看一下这个项目下的文件。 从下面的文件结构图可以看到&#xff0c;该项目下有3个文件&#xff0c;untitled.ui,untitled.py 以及main.py。 QtDesigner可以UI界面的方式&am…

MySQL 基于成本的优化

其实在MySQL中⼀条查询语句的执⾏成本是由下边这两个⽅⾯组成的&#xff1a; I/O成本 我们的表经常使⽤的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的&#xff0c;当我们想查询表中的记录时&#xff0c;需要先把数据或者索引加载到内存中 然后再操作。这个从磁盘…

livox 半固体激光雷达 gazebo 仿真 | 更换仿真中mid360雷达外形

livox 半固体激光雷达 gazebo 仿真 | 更换仿真中mid360雷达外形 livox 半固体激光雷达 gazebo 仿真 | 更换仿真中mid360雷达外形livox 介绍更换仿真中mid360雷达外形 livox 半固体激光雷达 gazebo 仿真 | 更换仿真中mid360雷达外形 livox 介绍 览沃科技有限公司&#xff08;L…

基于51单片机电子钟闹钟LCD1602显示proteus仿真设计

基于51单片机的LCD1602电子钟闹钟proteus仿真设计 基于51单片机的LCD1602电子钟闹钟proteus仿真设计功能介绍&#xff1a;仿真图&#xff1a;原理图&#xff1a;设计报告&#xff1a;程序&#xff1a;器件清单&#xff1a;资料清单&&下载链接&#xff1a; 基于51单片机…

如何训练专属的OCR文字识别模型

1. 背景 在10月24日程序员节&#xff0c;公司决定向每位技术人员发放购物实体卡以示庆祝。然而&#xff0c;手动输入实体卡上的一大串卡密可能是一项繁琐且不那么智能的任务&#xff1b;同时&#xff0c;线上用户在绑定购物卡的时候&#xff0c;同样也是需要手动输入。 基于以…

Mysql基础操作(命令行)

文章目录 Mysql基础操作&#xff08;命令行&#xff09;背景创建数据库选择数据库查看所有表查看表结构向表插入数据插入第一条插入第二条插入第三条 查询表数据修改表数据删除表数据 Mysql基础操作&#xff08;命令行&#xff09; 背景 docker安装mysql8&#xff0c;映射本地…

额温枪方案,MS8551,MS8601;MS1112,MS1100

鉴于测温的传感器信号非常微弱&#xff0c;需要用高精度、低噪声的运算放大器和高精度、低功耗的ADC。 运算放大器可供选择&#xff1a;MS8551 or MS8601&#xff0c;具有低失调&#xff08;1uV&#xff09;、低噪&#xff08;22nV√Hz &#xff09;、封装小等优点&#xff0c…

34970A 数据采集 / 数据记录仪开关单元

34970A 数据采集 / 数据记录仪开关单元 产品综述&#xff1a; Keysight 34970A 数据采集/数据记录仪开关单元由一个 3 插槽主机和一个内置的 6 1/2 位数字万用表组成。每个通道可以单独配置&#xff0c;以测量 11 种不同功能之一&#xff0c;这样既不会增加成本&#xff0c;也…

喜讯!云起无垠成为国家信息安全漏洞库(CNNVD)技术支撑单位

近日&#xff0c;云起无垠凭借其在漏洞挖掘、漏洞检测以及漏洞修复等领域的卓越表现&#xff0c;荣获“国家信息安全漏洞库&#xff08;CNNVD&#xff09;技术支撑单位等级证书&#xff08;三级&#xff09;”&#xff0c;正式成为CNNVD技术支撑单位。 中国国家信息安全漏洞库&…

科普:多领域分布式协同仿真

分布式协同仿真是一种在分布式计算环境中进行协同工作的仿真方法。使用该方法进行协同仿真时&#xff0c;仿真任务将被分发到多个计算节点上&#xff0c;并且这些节点可以同时工作以模拟完整的系统行为。分布式协同仿真已被广泛应用于工程、科学和军事领域&#xff0c;以便更好…

Python开源项目之人工智能老照片修复算法学习

文章目录 前言项目环境搭建conda虚拟环境创建激活环境Pytorch安装Synchronized-BatchNorm-PyTorch repository安装Global目录Synchronized-BatchNorm-PyTorch项目部署检测预处理模型下载下载脸部增强模型文件下载依赖完整部署后项目结构 项目使用验证一下总结关于Python技术储备…

【matlab程序】南海土台风画法

【matlab程序】南海土台风画法 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像修饰 【Python海洋专…

应用场景丨社区燃气管网监测系统建设

燃气作为现代社会的重要能源&#xff0c;燃气被广泛应用于居民生活、工业生产、商业服务等领域。然而&#xff0c;燃气泄漏事故时有发生&#xff0c;不仅给人们的生命财产安全带来严重威胁&#xff0c;也给燃气行业的发展带来不良影响。因此&#xff0c;对于燃气管道的监测和管…