实现一个简易版本的IOC

news/2025/10/26 15:42:34/文章来源:https://www.cnblogs.com/sunnycc/p/19166917

简单的IOC其实就是一个map,key是对象名字,value是对象的实例,Spring容器初始化的时候会将配置文件或注解信息转换成BeanDefinition对象存储在集合中,然后遍历集合通过反射实例化Bean,实例化后的Bean会放入到名为singletonObjects的Map中,当调用getBean的时候会从singletonObjects对象中取出对应的Bean实例。

 

一:定义一个BeanDefinition

package com.tiny.spring.beans.factory.config;
public class BeanDefinition {private String id;private String className;public BeanDefinition() {}public BeanDefinition(String id, String className) {this.id = id;this.className = className;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}
}

 

二:读取配置文件并反射生成对象

package com.tiny.spring.context.support;import com.tiny.spring.beans.factory.config.BeanDefinition;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ClassPathXmlApplicationContext {private List<BeanDefinition> beanDefinitions = new ArrayList<>();private Map<String, Object> singletons = new HashMap<>();public ClassPathXmlApplicationContext(String pathname) {this.readXml(pathname);this.instanceBeans();}private void readXml(String pathname) {SAXReader saxReader = new SAXReader();try {URL xmlPath = this.getClass().getClassLoader().getResource(pathname);Document document = saxReader.read(xmlPath);Element rootElement = document.getRootElement();// 对配置文件的每一个<bean>标签进行处理for (Element element : rootElement.elements()) {// 获取Bean的基本信息String beanId = element.attributeValue("id");String beanClassName = element.attributeValue("class");BeanDefinition beanDefinition = new BeanDefinition(beanId, beanClassName);// 将Bean的定义存放到BeanDefinition
                beanDefinitions.add(beanDefinition);}} catch (DocumentException e) {e.printStackTrace();}}/*** 利用反射创建Bean实例,并存储在singletons中*/private void instanceBeans() {for (BeanDefinition beanDefinition : beanDefinitions) {try {singletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {e.printStackTrace();}}}/*** 对外提供的方法,让外部程序获取Bean实例* @param beanName* @return*/public Object getBean(String beanName) {return singletons.get(beanName);}
}

 

三:结果测试

package com.tiny.spring.test;import com.tiny.spring.beans.BeansException;
import com.tiny.spring.context.support.ClassPathXmlApplicationContext;
import com.tiny.spring.test.service.AService;public class OriginalIoCContainerTest {public static void main(String[] args) throws BeansException {ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("beans.xml");AService aService = (AService) classPathXmlApplicationContext.getBean("aService");aService.sayHello();}
}

 

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

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

相关文章

Alibaba Cloud Linux 4 安装docker后,修复docker的方法

Alibaba Cloud Linux 4 安装docker后,修复docker的方法#!/bin/bashset -e echo "🔧 Docker 服务崩溃修复..." # 停止所有 Docker 相关服务echo "🛑 停止 Docker 服务..."sudo systemctl stop …

MPK(Mirage Persistent Kernel)源码笔记(2)--- 多层结构化图模型

MPK(Mirage Persistent Kernel)源码笔记(2)--- 多层结构化图模型 目录MPK(Mirage Persistent Kernel)源码笔记(2)--- 多层结构化图模型0x00 概要0x01 机制1.1 当前问题1.2 解决方案1.2.1 μGraphs:多层次计算…

day000 ML串讲

numpy模块numpy模块的主要作用:numpy表示一维或者多维的数组(容器),主要是用来存储和运算数值型数据的。常用属性:shape:返回数组的形状 ndim:返回数组的维度 size:返回数组元素的个数 dtype:返回数组元素的数…

我的学习方式破局思考 ——读《认真听讲》、《做中学》与《做教练》有感

坦白说,在点击那三篇链接之前,我以为这又是一次“形式大于内容”的任务。但读完的那一刻,我感到脸上发烫,心中却豁然开朗。这三篇文章,像三位来自不同角度的导师,共同对我陈旧的学习观念进行了一次彻底的“手术”…

cmd运行python文件

C:\Users\Air>python F:\blogs\鱼书\man.py Initialized Hello David! Good-bye David!

Unity协程除了实现功能还可以增加可读性

协程作为异步、延时等待。还可以作为Update的解耦已读方案。 以一个UI淡进淡出为例。 不是用协程时,Lerp的更新都包含在Update方法中:1 1 using UnityEngine;2 2 using UnityEngine.UI;3 3 4 4 namespace UI.Mai…

2025年TPU厂家权威推荐榜:专业TPU加纤、TPU改性生产技术实力与市场口碑深度解析

2025年TPU厂家权威推荐榜:专业TPU加纤、TPU改性生产技术实力与市场口碑深度解析 随着全球高分子材料行业的快速发展,热塑性聚氨酯弹性体(TPU)作为一种性能优异的高分子材料,在汽车制造、电子电器、医疗器械、运动…

Nginx程序结构及核心配置

Nginx程序结构及核心配置1. 程序结构 $ sudo rpm -ql nginx /etc/logrotate.d/nginx # 配置日志切割策略 /etc/nginx # nginx 主程序存放路径 /etc/nginx/conf.d # nginx 配置文件目录 /etc/nginx/conf.d/default.conf…

事倍功半是蠢蛋57 typora相对路径图片上传到github

3️⃣ Typora 中设置图片自动复制(推荐) 打开 Typora → 文件(File) → 偏好设置(Preferences) → 图像(Images): 插入图片时:选择 “复制图片到指定路径” 指定路径:./images 插入时使用:相对路径 以后你在 Typ…

Nginx部署星益小游戏平台(静态页面)

Nginx部署星益小游戏平台(静态页面)1. 星益小游戏平台部署 源码下载:https://c1026.dmpdmp.com/e01306e2fdcd92aac114784572ec6e20/68a424b6/2019/08/17/f1aac2083a4d2e76196e57e68aed173f.zip?fn=%E6%98%9F%E7%9B…

hadoop应用遇到的问题

当遇到如下问题,大致是安装包有问题,需要重新下载安装包,但是直接用命令行下载需要十个小时,这边在widows上下载好在传送到虚拟机 接着按照以下步骤 结合你当前hdfs命令功能受限的问题,以下是彻底修复Hadoop环境的…

企业级Nginx安装部署

企业级Nginx安装部署1. Nginx 安装方式编译安装:使用源码,根据企业业务需求,需要什么功能,编译时添加什么模块,但是安装过程较为繁琐 自动化安装:配置好安装源,直接通过自动化工具安装即可 二进制安装:解压即用…

2025 年 10 月门窗十大品牌综合实力权威推荐榜单,聚焦产能、专利与环保的实力品牌深度解析

2025 年 10 月门窗十大品牌综合实力权威推荐榜单由中国建筑金属结构协会、全国工商联家具装饰业商会联合发布。本次榜单以 “产能保障 + 专利技术 + 环保标准” 为核心评估体系,突破传统单一性能评选局限:产能维度考…

以“听”为基,以“做”为翼

原文:Scalers:大学生上课为什么一定要认真听讲? https://www.scalerstalk.com/816-attention 读《大学生上课为什么一定要认真听讲?》,我对课堂学习的重要性有了更为深刻的体悟。 课堂是知识传递的核心阵地,老师…

序列密码基本模型

随机序列 基本概念 https://www.cnblogs.com/luminescence/p/18938331 最终周期序列 设\(\{s_i\}^{\infty}_{i=1}\)是一条序列,假如存在正整数\(t\)和\(r\),使得对于任意\(i>=t\)都有\(s_{i+r} = s_i\) 则最小整数…

企业级Web应用及Nginx介绍

企业级Web应用及Nginx介绍1. Nginx 简介 Nginx("engine x")是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以…

2025 年 10 月门窗十大品牌综合实力权威推荐榜单,精准检测与稳定性能兼具的行业优选解析

2025 年 10 月门窗十大品牌综合实力权威推荐榜单由中国建筑金属结构协会、全国工商联家具装饰业商会联合发布。本次榜单以 “精准检测认证 + 长期稳定性能” 为核心评估逻辑,突破传统评选单一性:检测维度严格执行《铝…

11种排序算法的Python代码实现

一、算法信息直接插入排序 O(n^2),O(1),稳定 折半插入排序 O(n^2),O(1),稳定 希尔排序 时间复杂度与增量序列有关,O(1) 冒泡排序 O(n^2),O(1),稳定 快速排序 O(nlogn),O(1),不稳定 简单选择排序 O(n^2),O(1),不稳定 堆…

解码Linux文件IO之中文字库原理与应用

中文字库核心概念 在嵌入式项目中显示汉字,需解决 “计算机如何存储和识别汉字” 的问题 —— 早期 ANSI 字符集仅收录 256 个字符(无中文),因此中国制定了GB2312 简体中文字符集,成为嵌入式中文显示的核心标准。…

完整教程:突破NER性能瓶颈:BERT与LLM协同的混合架构实践

完整教程:突破NER性能瓶颈:BERT与LLM协同的混合架构实践2025-10-26 15:00 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important…