当前位置: 首页 > news >正文

实现一个简易版本的IOC

简单的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.rkmt.cn/news/30857.html

相关文章:

  • Alibaba Cloud Linux 4 安装docker后,修复docker的方法
  • 2025年TPU厂家权威推荐榜:专业TPU加纤、TPU改性生产技术实力与市场口碑深度解析
  • hadoop应用遇到的问题
  • 企业级Nginx安装部署
  • 2025 年 10 月门窗十大品牌综合实力权威推荐榜单,精准检测与稳定性能兼具的行业优选解析
  • 2025 年 10 月门窗十大品牌综合实力权威推荐榜单,聚焦高端定制需求与全案交付能力
  • 力扣 第473场周赛(A~D)
  • Java学习与工作汇报总结
  • Alibaba Cloud Linux 4 镜像备份到自己的 OSS 中,并同时使用该镜像部署
  • Function Calling
  • 20232302 2025-2026-1《网络与系统攻防技术》实验三实验报告
  • 2025 年 10 月门窗十大品牌综合实力权威推荐榜单,产能、专利、环保三维数据透视
  • 2025年10月膜结构厂家推荐榜:双资质企业对比评测 ,
  • 2025 年 10 月蒸汽发生器厂家最新推荐,聚焦高端定制需求与全案交付能力
  • 2025 年 10 月蒸汽发生器厂家最新推荐,精准检测与稳定性能深度解析
  • 2025年10月敏感肌产品推荐榜:淡斑修护面霜排名一览
  • LLM-提示词(二)
  • Windows下编译ffmpeg(MinGW+MSYS2)参考链接
  • 2025 年 10 月贵州旅游旅行社最新推荐,聚焦高端定制需求与全案交付能力
  • 2025 年 10 月贵州旅游旅行社最新推荐,实力品牌深度解析采购无忧之选!
  • 存储系统
  • 102302122许志安作业1
  • ARC201B Binary Knapsack
  • LDC
  • 完整教程:由JoyAgent观察AI Agent 发展
  • Spark计算引擎
  • 173天隧道技术篇防火墙组策略ICMPDNSSMB协议出网判断C2上线解决方案
  • 实用指南:3DGS 如何理解它?
  • 面试总被追问k8s调度器工作原理, 收藏 == 学废
  • 题解:十二重计数法