zoukankan      html  css  js  c++  java
  • 自定义模拟一个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(); } }

           ⑥、测试结果如下:

                    

              

     示例结束、谢谢浏览!


  • 相关阅读:
    ie烦人的bug篇
    javascript之复习(框架里的方法们)
    javascript之判断专题
    js 值类型和引用类型
    作用域链
    javascript解析机制——预解析
    SSH做反向代理
    怎样在 CentOS 7.0 上安装和配置 VNC 服务器
    创建GitHub技术博客全攻略
    rsync 备份 CENTOS 系统!
  • 原文地址:https://www.cnblogs.com/demoMeng/p/5890223.html
Copyright © 2011-2022 走看看