实现spring配置bean类机制

大家好,这里是教授.F

流程说明:

我们自己实现spring配置bean类的机制,要先了解原本是怎么实现的。

原本的机制就是有一个bean配置文件,还有一个ApplicationContext spring文件。bean类写着要扫描的文件信息,spring文件会根据bean类中进行容器初始化,并且将bean类写的文件下的所有包(包括子包,是有注解的类)进行创建和生成对象。

也就是这样:

我们想自己实现配置机制,就要实现bean的功能----指定要扫描的包。然后再创建一个容器,进行初始化和创建要扫描的包并生成对象。

大体的思路就是这样。

 更详细的就是这样了:

涉及到的知识点有反射+IO+类的加载器+注解+容器。最难的就是用反射怎么拿。

细节流程:

/*** 流程:* 1.创建ioc容器,因为不能修改,所以用final修饰,而且需要线程安全,使用ConcurrentHashMap* 2.为了能在其他地方使用到构造器* 3.传入类,进行初始化* 4.获取扫描的包*      要解析配置类的class类型*      getDeclaredAnnotation用于获取指定类型的注解(Annotation)。它可以在运行时检索类、方法、字段等程序元素上的注解信息。* 5.解析后需要获取了注解中的 value 属性*      在@ComponentScan注解中,value属性用于指定需要扫描的包路径* 6.得到路径后,将路径进行替换* 7.因为要扫描path下的资源(.class文件),所以需要使用到类加载器*      因为类加载器在加载类的过程中,可以解析出类文件的路径* 8.使用类加载器去解析路径* 9.根据解析路径,使用getFile()得到文件名*      getFile() 方法通常是用于从 URL 对象中获取文件名部分的方法* 10.使用isDirectory()判断得到的文件名是不是路径*      isDirectory() 方法是用于判断一个 File 对象所表示的路径是否为一个目录(文件夹)* 11.使用增强for循环,分别拿出各个.class类* 12.通过绝对路径来获取类名和类的完整路径(全类名)。* 13.从绝对路径得到类名再得到全类名* 14.进行过滤,只处理class文件,判断该类是不是需要注入到容器【如果该类没有注解就不需要注入容器】*      怎么处理呢:使用localClass尝试加载指定名称的类。加载后使用isAnnotationPresent 判断*          isAnnotationPresent 是一个方法,用于检查类、方法或字段是否被特定的注解修饰* 15.在这个if判断中,可以进行一些业务操作* 16.开始反射对象,使用forName方法*      forName() 方法是用于在运行时动态加载类的静态方法。它接收一个类的完全限定名(包括包名)作为参数,*          然后尝试加载并返回对应的 Class 对象* 17.使用返回的对象,调用被加载类的无参构造函数来创建对象,并存入ioc容器中*      newInstance()它用于创建一个类的新实例。这个方法会调用被加载类的无参数构造函数来创建对象。*/

当然这并不能和真正的spring配置机制来比,只是模拟一下而已。

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

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

相关文章

【Python学习】数据结构+正则表达式

个人主页:Yang-ai-cao 系列专栏:Python学习 博学而日参省乎己,知明而行无过矣 目录 个人主页:Yang-ai-cao 系列专栏:Python学习 博学而日参省乎己,知明而行无过矣 数据结构 一、列表(Lis…

风电机组与风力发电机:它们是同一个东西吗?

风电机组与风力发电机:它们是同一个东西吗? 风电机组和风力发电机是两个常见的术语,尤其是在可再生能源领域。虽然这两个术语有时会被混淆使用,但它们实际上指的是不同的设备和系统。为了弄清楚它们之间的关系,本文将…

最近很火的 ChatTTS项目,有大佬做的 ChatTTS-UI 来啦

地址:https://github.com/jianchang512/ChatTTS-ui 》》》更多开源项目 ChatTTS webUI & API 一个简单的本地网页界面,直接在网页使用 ChatTTS 将文字合成为语音,支持中英文、数字混杂,并提供API接口。 Releases中可下载Wi…

光伏并网逆变器UL 1741:2021标准解析

光伏并网逆变器UL 1741:2021标准解析 不同国家的安规认证可以说是光伏逆变器走向国际市场的一张通行证,由于全球各国家的电网制式及并网政策的不同差异,这对逆变器测试顺利的通过安规测试认证 还是有一定的技术难度,也是中国光伏制造企业迫切…

最全解析:只有了解低代码平台的今生前世,才能明白低代码是什么

低代码(Low-Code)是一种软件开发方法,它使得开发人员能够通过图形界面、拖放组件和模型驱动的逻辑,快速地构建和部署应用程序,而无需编写大量的代码。尽管低代码这个术语是在2014年才提出,从诞生之初距今不…

【数据结构】复杂度的重要性—–决定程序运行的效率

【数据结构】复杂度的重要性—–决定程序运行的效率 前言 在我们写算法的时候,常常会需要考虑一个问题:这个算法好不好?而这个“好”实际上就取决于是算法的复杂度。 算法复杂度(Algorithmic Complexity)是指算法在编…

如何在电脑上安装两个flutter版本

Flutter Version Manager (FVM): Flutter的版本管理终极指南 Mac的flutter多版本管理之fvm的安装及使用 一、安装fvm brew tap leoafarias/fvm brew install fvm这个错误可能是由于网络问题或者 Git 配置问题导致的,我开启了梯子就可以了 brew install watchman…

Low Memory Killer in Android

目录 低内存管理(Linux vs Android) Linux内存回收 shrink_slab原理 shrink_zone原理 oom killer oom killer设计原则 OOM killer具体实现 android的lmk(Low Memory Killer) Android系统特点 oom killer在android中的不足 ​​​​​​​LMK概…

基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用

背景 随着互联网服务的广泛普及与技术应用的深入发展,日志数据作为记录系统活动、用户行为和业务操作的宝贵资源,其价值愈发凸显。然而,当前海量日志数据的产生速度已经远远超出了传统数据分析工具的处理能力,这不仅要求我们具备…

【机器学习】机器学习与AI大数据的融合:开启智能新时代

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 机器学习与AI大数据的融合 📒1. 引言📕2. 机器学习与大数据🎩机器学习与大数据的特征🎈大数据如…

驱动开发之platform总线

1.前言 在前面的实验以及提出的各种问题中,为了提高移植性,降低模块耦合度,提让模块高内聚,分离device与driver是一个必然的趋势了。为了解决这个问题,心心念念的platform总线出来。 linux从2.6起就加入了一套新的驱…

python中利用cartopy库绘制SST图像

1. Cartopy简介 Cartopy 是一个开源的 Python 库,用于绘制地图和地理数据分析。它结合了 matplotlib 的绘图功能和 shapely、pyproj 等库的地理空间数据处理能力,为用户提供了在地图上可视化数据的强大工具。 以下是 Cartopy 的一些主要特点和功能&#…

探索不同类型的“低”之魅力

随着数字化转型的浪潮不断高涨,低代码平台(LCDP)已逐渐成为企业快速构建和迭代应用程序的重要工具。低代码平台以其高效、灵活和易于集成的特点,受到越来越多企业的青睐。然而,低代码平台并非一蹴而就的单一产品&#…

CST电磁仿真软件表面等离子极化激元SPP --- 一维光栅耦合 - 衍射模式, 效率, Floquet端口

这两期我们看一下衍射光栅的高阶衍射、衍射效率、反射率。具体到仿真设置,就是Floquet端口的模式分析,S参数与衍射效率和反射率的关系。那么研究这些衍射和表面等离子极化激元SPP有什么关系呢?关系可大了,光栅是一种能够用来激励出…

告别鼠标,安卓模拟鼠标,绘图板,手写板操作电脑PC端,卡卡罗特也说好,儿童节快乐

家人们,上链接了:https://download.csdn.net/download/jasonhongcn/89387887 横屏模式: 竖屏模式: 操作说明: 1. 手势滑动模拟鼠标移动 2. 界面如果有滚动条,右手指按紧,通过左手指移动实现…

力扣:101. 对称二叉树

101. 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false提示: …

mysql DDL——增删改

简略版: 文字化: 1.对全部字段添加数据:insert into 表名 values (值1,值2,值3...); 2.对指定字段添加数据:insert into 表名 (字段名1,字段名2...) values (值1,值2..…

跨区域文件管控过程中 如何保障安全和效率?

跨区域文件管控是指在跨越不同地域或区域的情况下对文件进行管理和控制的过程。这种控制可能涉及多个方面,包括安全性、合规性和管理效率等。 为了有效进行跨区域文件管控,组织通常需要采取一系列策略和措施,例如: 1、加密和安全…

旺店通·企业奇门和金蝶云星空接口打通对接实战多系统间数据

旺店通企业奇门和金蝶云星空接口打通对接实战 来源系统:旺店通企业奇门 慧策(原旺店通)是一家技术驱动型智能零售服务商,基于云计算PaaS、SaaS模式,以一体化智能零售解决方案,帮助零售企业数字化智能化升级&#xff0c…

二进制文件(.bin等文件)转C语言数组形式hex文件(.c等文件)

使用python脚本把二进制文件(.bin等文件)转C语言数组形式hex文件(.c等文件),具体代码如下: (1)读取.bin文件数据 (2)生成C语言数组定义 (3&…