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类型。
相关文章:
Spring原理——基于xml配置文件创建IOC容器的过程
Spring框架的核心之一是IOC,那么我们是怎么创建出来的Bean呢? 作者进行了简单的总结,希望能对你有所帮助。 IOC的创建并不是通过new而是利用了java的反射机制,利用了newInstance方法进行的创建对象。 首先,我们先定义…...
CUDA initialization failure with error: 999
ubuntu20.04,安装tensorRT, 执行example里面的./sample_char_rnn程序,测试时候报了如标题的一个错误,居然如下两行代码这样解决了,这两行命令好像是重新加载nvidia内核模块,有点玄学: sudo rmmod nvidia_u…...
一些权限方面的思考
一些权限方面的思考 背景说明自定义注解解析自定义注解 背景 鉴权可以通过切面做抽取 说明 都是一些伪代码, 不能直接使用, 提供一种思路. 都是一些伪代码, 不能直接使用, 提供一种思路. 都是一些伪代码, 不能直接使用, 提供一种思路. 自定义注解 自定义注解: Permission …...
NX二次开发UF_CURVE_add_faces_ocf_data 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_add_faces_ocf_data Defined in: uf_curve.h int UF_CURVE_add_faces_ocf_data(tag_t face_tag, UF_CURVE_ocf_data_p_t uf_offset_data ) overview 概述 Add a face col…...
MacM1(ARM)安装Protocol Buffers
MacM1(ARM)安装Protocol Buffers 本文目录 MacM1(ARM)安装Protocol Buffers3.21之前版本安装使用configure3.22之后版本安装使用cmake使用编译后的版本 protobuf下载地址:https://github.com/protocolbuffers/protobuf/releases 在运行./autogen.sh或./configure命…...
使用C++从0到1实现人工智能神经网络及实战案例
引言 既然是要用C来实现,那么我们自然而然的想到设计一个神经网络类来表示神经网络,这里我称之为Net类。由于这个类名太过普遍,很有可能跟其他人写的程序冲突,所以我的所有程序都包含在namespace liu中,由此不难想到我…...
React Router
一、简介 react router是一个构建基于react应用的路由管理库。允许你在程序中定义不同的路由和导航规则。以实现不同的url路径显示不同的组件。 二、相关技术 <Router><div><ul id "menu"><li><Link to "/home">Home<…...
https 是否真的安全,https攻击该如何防护,https可以被抓包吗?如何防止呢?
首先解释一下什么是HTPPS 简单来说, https 是 http ssl,对 http 通信内容进行加密,是HTTP的安全版,是使用TLS/SSL加密的HTTP协议 Https的作用: 内容加密 建立一个信息安全通道,来保证数据传输的安全&am…...
C++中声明友元
C中声明友元 不能从外部访问类的私有数据成员和方法,但这条规则不适用于友元类和友元函数。要声明友元 类或友元函数,可使用关键字 friend,如以下示例程序所示: 使用关键字 friend 让外部函数 DisplayAge( )能够访问私有数据成员…...
【GPT-3.5】通过python调用ChatGPT API与ChatGPT对话交流
文章目录 一、引言二、AIGC简介三、OpenAI介绍四、GPT-3.5介绍五、获得OpenAI API Key六、调用ChatGPT API实现与ChatGPT对话七、参考链接 一、引言 ChatGPT 的火爆,成功带火了AIGC,让它进入大众的视野。 ChatGPT 和Whisper API 开发者现在可以通过API将…...
Vatee万腾的科技探险:vatee数字化力量的前瞻征途
在Vatee万腾的科技探险中,我们领略到了一场数字化力量的前瞻征途,这是一次引领未来的创新之旅。Vatee万腾以其独特的科技理念和数字化力量,开启了一次引领行业的前瞻性征途,为数字化未来描绘出了崭新的篇章。 Vatee万腾的数字化力…...
github使用token认证
向github提交代码时报错:Support for password authentication was removed on August 13, 2021. Please use a personal access token instead。大概意思就是,原先的密码凭证从2021年8月13日开始就不能用了,后续必须使用个人访问令牌&#x…...
基于C#实现线段树
一、线段树 线段树又称"区间树”,在每个节点上保存一个区间,当然区间的划分采用折半的思想,叶子节点只保存一个值,也叫单元节点,所以最终的构造就是一个平衡的二叉树,拥有 CURD 的 O(lgN)的时间。 从…...
AI智能客服搭建教程附带免费源码
*名称* *版本要求* 服务器 CPU 2核心 ↑运存 4G ↑宽带 5M ↑ 服务器操作系统 Linux Centos7 运行环境 Nginx 1.18 PHP 7.3 MYSQL 5.6 服务器配置及环境要求 PHP设置 一、安装PHP扩展插件:fileinfo、redis、 sg11 二、删除PHP对应版本中的 pcntl_signal 、pcntl_signal_dis…...
Shell脚本:Linux Shell脚本学习指南(第三部分Shell高级)四
十九、Linux Shell trap命令:捕获信号 到目前为止,我们在本教程所见的脚本中还没有需要信号处理功能的,因为它们的内容相对比较简单,执行时间很短,而且不会创建临时文件。而对于较大的或者更复杂的脚本来说࿰…...
牛气霸屏-快抖云推独立版V1.6.7
介绍 快抖云推全插件独立版是最近很火的牛气霸屏系统独立版,牛气霸屏系统就是商家通过系统在线创建抖音或快手霸屏活动,并生成该活动的爆客二维码,用户通过扫二维码即可参加活动(活动可以是领取卡劵,抽奖等࿰…...
ffmpeg下载与配置环境变量
FFmpeg 是一个强大的多媒体框架,可以让用户处理和操纵音频和视频文件。具有易于使用的界面,用户可以在 Windows、Mac 或 Linux Ubuntu 系统上下载 FFmpeg 并将其提取到文件夹中。然后,该软件可以加入 PATH 环境变量中就可以快捷的使用软件了.…...
那些年,关于CKACKS认证的那些事儿?
前言 遥想2020年的年初,疫情封城封村之际,工作之余在B站将尚硅谷的linux中的k8s视频完整系统的学习了一遍,自此像是打通了任督二脉一般,开启了对k8s的探索之旅,一路也是磕磕绊绊的在工作中使用k8s。 终于在23年的6月仲…...
chromium通信系统-mojo系统(一)-ipcz系统代码实现-同Node通信
在chromium通信系统-mojo系统(一)-ipcz系统基本概念一文中我们介绍了ipcz的基本概念。 本章我们来通过代码分析它的实现。 handle系统 为了不对上层api暴露太多细节,实现解耦,也方便于传输,ipcz系统使用handle表示一个对象,hand…...
电路 buck-boost相关知识
BUCK-BOOST 文章目录 BUCK-BOOST前言一、DC-DC工作模式电容电感特性伏秒积平衡原理 二、BUCK电路三、BOOST电路四、BUCK-BOOST电路总结 前言 最近需要用到buck-boost相关的电路知识,于是便写下这篇文章复习一下。 一、DC-DC 在学习buck-boost电路之前我们先来看一…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...




