一、模拟一个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容器的更多相关文章

  1. 深入理解Spring IoC容器和动态代理机制

    Deployment期间验证 实现一: <bean id="theTargetBean" class="..."/> <bean id=&qu ...

  2. 深入理解Spring IOC容器及扩展

    本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...

  3. 纯注解快速使用spring IOC容器

    使用spring的ioc容器实现对bean的管理与基本的依赖注入是再经典的应用了.基础使用不在详述. 这里主要介绍下使用注解实现零配置的spring容器.我相信你也会更喜欢使用这种方式.Spring ...

  4. 深入理解Spring IOC容器

    本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...

  5. 造轮子:实现一个简易的 Spring IoC 容器

    作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...

  6. (反射+内省机制的运用)简单模拟spring IoC容器的操作

    简单模拟spring IoC容器的操作[管理对象的创建.管理对象的依赖关系,例如属性设置] 实体类Hello package com.shan.hello; public class Hello { ...

  7. Spring IOC容器分析(2) -- BeanDefinition

    上文对Spring IOC容器的核心BeanFactory接口分析发现:在默认Bean工厂DefaultListableBeanFactory中对象不是以Object形成存储,而是以BeanDefin ...

  8. Spring IOC容器基本原理

    2.2.1 IOC容器的概念IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IOC容器 ...

  9. 1.3浅谈Spring(IOC容器的实现)

    这一节我们来讨论IOC容器到底做了什么. 还是借用之前的那段代码 ClassPathXmlApplicationContext app = new ClassPathXmlApplicationCon ...

随机推荐

  1. 【刷题记录】首师附NOIP练习20160820

    [由于老师不让发题目,So只能发考点喽!!!!噜噜噜] [题目(嘘~~~~~)]:百度云下载 [T1]:好像是DP,路径压缩+排序+分情况处理100分(噜噜噜) [T2]:正解好难的样子,DFS乱搞了 ...

  2. 用Fiddler的自动响应模拟系统集成

    1. 下载最新版本的Fiddler Fiddler 官网 2, 安装并启动Fiddler 3, 勾选自动响应 见上图 4, 添加自动响应规则 见上图 5, 添加自动响应内容文件 添加响应文件到Fidd ...

  3. 迷之bug

    是这样的.要解决tbody滚动,而thead不动的布局问题,我把它们分别放在两个表格里,上面的只有thead,下面的只有tbody, 然后解决宽度对齐的问题,我用colgroup设置每列的宽度,用的都 ...

  4. 懒加载lazyload

    什么是懒加载 懒加载就是当你做滚动到页面某个位置,然后再显示当前位置的图片,这样做可以减少页面请求. 懒加载:主要目的是作为服务器前端的优化,减少请求数或延迟请求数,一些图片非常多的网站中非常有用,在 ...

  5. js 短信验证码 计时器

    $(function(){ getMsg(); //页面加载完成之后执行 }) function getMsg(){ //注册按钮的点击事件 $("#smsBtn").on(&qu ...

  6. display:none与visible:hidden的区别

    display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失,通俗来说就 ...

  7. 一个简单的路由,用javascript实现

    前端路由在很多开源的js类库框架中都得到支持,如angularJS,Backbone,Reactjs等等.前端路由和后端路由原理一样,是让所有的交互和展现在一个页面运行以达到减少服务器请求,提高客户体 ...

  8. 代码编辑器Sublime Text 3 免费使用方法与简体中文汉化包下载

    Sublime Text这款代码编辑器是Jeff 一直都在使用的,前段时间转用到版本3,因为感觉Sublime Text 3 启动速度更加快,运行更加流畅——虽然3 还是在Beta 阶段.下面就直接分 ...

  9. maven 本地仓库和远程仓库

    在Maven中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件. Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库.(仓库就是存放依赖和插件的地方) 任何的 ...

  10. C#编程模式之扩展命令

    C#编程模式之扩展命令 前言 根据上一篇的命令模式和在工作中遇到的一些实际情况,有了本篇文章,时时都是学习的一个过程,会在这个过程中发现许多好的模式或者是一种开发方式,今天写出来的就是我工作中常用到的 ...