自定义模拟一个Spring IOC容器
一、模拟一个IOC容器:
介绍:现在,我们准备使用一个java project来模拟一个spring的IOC容器创建对象的方法,也就是不使用spring的jar自动帮助我们创建对象,而是通过自己手动书写代码创建对象。
二、具体步骤:
1、创建一个java project,不导入任何的spring相关的jar包(除了dom4j需要使用的相关jar包),并且导入dom4j相关的jar包,如下。

其中,这两个jar包是用来解析 applicationContext.xml 配置文件的。
2、在src源文件夹中创建相关的类和接口如下:

①、首先,新建一个Demo.java实体类,代码如下:
package iocDemo;
public class Demo {
public void test(){
System.out.println("this is the first test!");
}
}
②、其次,新建一个ApplicationContext接口,代码如下:在ApplicationContext这个接口中定义一个getBean的方法,在springIOC容器中也有这个方法,本例就是模拟IOC容器中的这个方法,这个方法传入一个参数,就是applicationContext.xml配置文件中的bean的id值,意思是指定获取那个对象。
package iocDemo;
public interface ApplicationContext {
public Object getBean(String beanId);
}
③、之后,新建一个ClassPathXmlApplicationContext类,实现接口ApplicationContext。在这个类中具体实现getBean的方法,是核心部分,也就是模拟IOC容器中的getBean的方法。具体请看代码中的注释部分。
package iocDemo; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class ClassPathXmlApplicationContext implements ApplicationContext {
//定义一个成员属性,并且使用这个属性作为构造方法,用接收 new ClassPathXmlApplication("fileName")中的fileName即ApplicationContext.xml配置文件
private String fileName; public ClassPathXmlApplicationContext(String fileName) {
this.fileName=fileName;
} //重写是实现接口中的getBean()方法。
@Override
public Object getBean(String beanId) {
//获取当前对象(ClassPathXmlApplicationContext)的路径,用于下面获取applicationContext.xml配置文件的路径
String currentPath = this.getClass().getResource("").getPath(); //获取到ApplicationContext.xml配置文件文件路径
String xPath = currentPath+fileName;
//创建一个SAXReader对象,用来读取配置文件
SAXReader reader = new SAXReader(); //创建一个Document对象,SAXReader读取配置文件之后的返回值即Document对象
Document document =null; //创建一个Object对象用来返回创建的对象
Object obj =null;
try{
//SAXReader读取配置文件
document = reader.read(xPath);
//使用Document对象找到配置文件中的bean节点,并且强转为Element对象
Element bean = (Element)document.selectSingleNode("beans/bean[@id='"+beanId+"']");
//在bean节点中找到class属性,并且获取到这个属性的值
String beanClass = bean.attributeValue("class"); //通过反射把这个属性的值转化为指定的对象
obj = Class.forName(beanClass).newInstance(); }catch(Exception e){
System.out.println("文件读取错误!"+e.getMessage()); }
//返回这个对象
return obj; } }
④、新建一个配置文件applicationContext.xml 具体代码如下,因为我们是模拟IOC中的getBean方法,所以不用导入dtd文件。
<?xml version="1.0" encoding="UTF-8"?> <beans>
<bean id="test" class="iocDemo.Demo" scope="prototype"></bean>
</beans>
⑤、创建一个Test测试类,代码如下:
package iocDemo; /*
本例是模拟一个spring的ioc容器。
就是不使用spring的jar包来帮我们创建一个对象,而是自己手动书写代码来实现创建对象的目的
*/ public class Test { public static void main(String[] args) {
//创建一个ApplicationContext实现类的对象,这步模拟IOC容器创建。
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //使用这个对象获取Demo对象,这步模拟IOC容器在applicationContext.xml文件中获取指定的对象
Demo d = (Demo)ac.getBean("test");
//获取到这个对象调用这个对象的方法
d.test(); } }
⑥、测试结果如下:

示例结束、谢谢浏览!
自定义模拟一个Spring IOC容器的更多相关文章
- 深入理解Spring IoC容器和动态代理机制
Deployment期间验证 实现一: <bean id="theTargetBean" class="..."/> <bean id=&qu ...
- 深入理解Spring IOC容器及扩展
本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...
- 纯注解快速使用spring IOC容器
使用spring的ioc容器实现对bean的管理与基本的依赖注入是再经典的应用了.基础使用不在详述. 这里主要介绍下使用注解实现零配置的spring容器.我相信你也会更喜欢使用这种方式.Spring ...
- 深入理解Spring IOC容器
本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...
- 造轮子:实现一个简易的 Spring IoC 容器
作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...
- (反射+内省机制的运用)简单模拟spring IoC容器的操作
简单模拟spring IoC容器的操作[管理对象的创建.管理对象的依赖关系,例如属性设置] 实体类Hello package com.shan.hello; public class Hello { ...
- Spring IOC容器分析(2) -- BeanDefinition
上文对Spring IOC容器的核心BeanFactory接口分析发现:在默认Bean工厂DefaultListableBeanFactory中对象不是以Object形成存储,而是以BeanDefin ...
- Spring IOC容器基本原理
2.2.1 IOC容器的概念IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IOC容器 ...
- 1.3浅谈Spring(IOC容器的实现)
这一节我们来讨论IOC容器到底做了什么. 还是借用之前的那段代码 ClassPathXmlApplicationContext app = new ClassPathXmlApplicationCon ...
随机推荐
- ubuntu14.04禁用自动待机保持屏幕亮度
http://jingyan.baidu.com/article/9989c7461fd041f648ecfe05.html
- zookeeper工作原理、安装配置、工具命令简介
1.Zookeeper简介 Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. 2.zo ...
- linux shell中不显示路径了,显示为-bash-4.1#的两种解决办法
出现这个问题的原因是因为没有配置.bash_profile的问题,或者是我们不小心清空或删除了.bash_profile文件. 办法一:修改 ~/.bash_profile文件 步骤如下: vim ~ ...
- 使用canvas绘制一个时钟
周末学习canvas的一些基础功能,顺带写了一个基础的时钟.现在加工一下,做的更好看一点,先放上效果图: 谈一些自己的理解: (1).要绘制一个新的样式(不想被其他样式影响,或者影响到其他样式),那么 ...
- [原创]MySQL innodb_rollback_on_timeout参数对锁的影响
环境:Server version: 5.6.21-log MySQL Community Server (GPL) 前提提要: innodb_rollback_on_timeout是 ...
- Vuforia结合Skyshop: Image-Based Lighting Tools & Shaders插件实现真实的光照效果
Skyshop: Image-Based Lighting Tools & Shaders 插件地址:https://www.assetstore.unity3d.com/en/#!/cont ...
- 【SQLServer】“无法对数据库'XXX' 执行删除,因为它正用于复制”的解决方法
从今天起,把编程中遇到的所有问题都记录下来,以便今后参考,以及方便网友查阅,希望我的问题可以帮助到很多志同道合的人们,我也是受很多前辈的提点,一步一步走来,希望大家都不要吝啬,将自己遇到的问题记录下来 ...
- USACO翻译:USACO 2012 JAN三题(1)
USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery c ...
- linux时间同步ntp服务的安装与配置
1.首先安装NTP [root@localhost /]# yum install ntp -y 2.修改NTP配置文件,添加NTP服务器的网络位置 /etc/ntp.conf # For mo ...
- 使用Junit等工具进行单元测试
一.类的定义: 类是同一事物的总称,类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实体被称为类. 二.Junit工具的使用: 1.首先新建一个项目叫JUnit_Test,我们编写一个 ...