尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

实现一个简易版本的IOC

实现一个简易版本的IOC
📅 发布时间:2026/6/26 10:03:44

简单的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();}
}

 

相关新闻

  • Alibaba Cloud Linux 4 安装docker后,修复docker的方法
  • 2025年TPU厂家权威推荐榜:专业TPU加纤、TPU改性生产技术实力与市场口碑深度解析
  • hadoop应用遇到的问题

最新新闻

  • 如何让JavaScript应用听懂你的日程安排?Sherlock自然语言事件解析器深度解析
  • PaperXie AI PPT 生成器:文稿一键转演示文稿,打破 PPT 制作的效率壁垒
  • 接口自动化测试覆盖率实战:从概念到CI/CD集成的完整策略
  • 几何美学与现代设计:为什么Montserrat字体成为开源字体的典范?
  • 高速ADC芯片ADS4222IRGCR选型、硬件设计与调试全攻略
  • Java毕业设计-基于 SpringBoot 的网上书店系统设计与实现 SpringBoot 框架下在线图书销售管理系统设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)

日新闻

  • Qwen2.5-Turbo百万上下文实战指南:百炼平台长文本处理全解析
  • 怎么监控对标账号更新,2026年作者监控工作流,5款深度对比
  • EdgeRemover:专业级Windows Edge浏览器管理工具,彻底解决顽固软件卸载难题

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号