Spring原理——基于xml配置文件创建IOC容器的过程

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.hqwc.cn/news/216073.html

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

相关文章

python-opencv轮廓检测(外轮廓检测和全部轮廓检测,计算轮廓面积和周长)

python-opencv轮廓检测(外轮廓检测和全部轮廓检测,计算轮廓面积和周长) 通过cv2.findContours,我们可以进行轮廓检测,当然也有很多检测模式,我们可以通过选择检测模式,进行外轮廓检测&#xff…

NeurIPS 2023|AI Agents先行者CAMEL:第一个基于大模型的多智能体框架

AI Agents是当下大模型领域备受关注的话题,用户可以引入多个扮演不同角色的LLM Agents参与到实际的任务中,Agents之间会进行竞争和协作等多种形式的动态交互,进而产生惊人的群体智能效果。本文介绍了来自KAUST研究团队的大模型心智交互CAMEL框…

VR全景展示,“超前点播”打开娱乐行业线上营销门户

如今,人们的生活水平正在逐步提高,这种提高不仅仅是体现在衣食住行上,更多方面是体现在大众的娱乐活动上。我们可以看到,相比于过去娱乐种类的匮乏,现如今,各种娱乐活动可谓是百家争鸣,例如温泉…

亚马逊云科技re:Invent大会:云计算与生成式AI共筑科技新局面,携手构建未来

随着科技的飞速发展,云计算和生成式 AI 已经成为了推动科技进步的重要力量。这两者相互结合,正在为我们创造一个全新的科技局面。 亚马逊云科技的re:Invent大会再次证明了云计算和生成式AI的强大结合正在塑造科技的新未来。这次大会聚焦了云计算的前沿技…

Linux(7):Vim 程序编辑器

vi 基本上 vi 共分为三种模式,分别是【一般指令模式】、【编辑模式】与【指令列命令模式】。 这三种模式的作用分别是: 一般指令模式(command mode) 以 vi 打开一个文件就直接进入一般指令模式了(这是默认的模式,也简称为一般模式)。在这个模…

【技术分享】RK3399 Ubuntu通过Python实现录音和播放功能

​本文基于IDO-SBC3968 Ubuntu 系统通过Python脚本实现录音和播放功能。 IDO-SBC3968采用RK3399国产六核64位CPU高性能处理器,支持4K HDMI2.0显示,接口丰富,拥有千兆以太网,全协议TypeC接口,USB3.0 ,eDP 和…

对 .NET程序2G虚拟地址紧张崩溃 的最后一次反思

一:背景 1. 讲故事 最近接连遇到了几起 2G 虚拟地址紧张 导致的程序崩溃,基本上 90% 都集中在医疗行业,真的很无语,他们用的都是一些上古的 XP,Windows7 x86,我也知道技术人很难也基本无法推动硬件系统和…

初始Linux系统下打印机插件配套问题

记录一下打印机跨系统跨平台的插件配套问题。 我看大多数博客的说法,都叫打印机驱动。我本人是做linux驱动开发的,总觉得这么叫不是很专业。因为厂家提供在PC上的安装包,只是实现了文档格式转换、一些配置或控制、在使用层面的功能&#xff0…

初始linux:文件操作

目录 提示&#xff1a;以下指令均在Xshell 7 中进行 linux的理念 一、echo echo "字符串" 二、输出重定向 > > [文件] echo "字符串" > [文件] echo "字符串" > > [文件] 制作大文件 三、< 输入重定向与ca…

C#关键字、特性基础及扩展合集(持续更新)

一、基础 Ⅰ 关键字 1、record record&#xff08;记录&#xff09;&#xff0c;编译器会在后台创建一个类。支持类似于结构的值定义&#xff0c;但被实现为一个类&#xff0c;方便创建不可变类型&#xff0c;成员在初始化后不能再被改变 &#xff08;C#9新增&#xff09; …

生态对对碰|华为OceanStor闪存存储与OceanBase完成兼容性互认证!

近日&#xff0c;北京奥星贝斯科技有限公司 OceanBase 数据库与华为技术有限公司 OceanStor Dorado 全闪存存储系统、OceanStor 混合闪存存储系统完成兼容性互认证。 OceanBase 数据库挂载 OceanStor 闪存存储做为数据盘和日志盘&#xff0c;在 OceanStor 闪存存储系统卓越性能…

【计算机网络笔记】数据链路层——差错编码

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…