zoukankan      html  css  js  c++  java
  • 简单模拟Spring的注入

    主要就是读XML技术和反射技术。

    在xml中读出相关配置信息,然后利用反射将其实例化为对象,并调用其构造方法,在实例化的过程中将属性注入实例。

    实例化和属性注入这些操作都交给了框架,不再需要自己的去new,相当于将控制权交给了框架,称为控制反转(IOC),又称为依赖注入(DI)

     

    xml文件:

    <beans>
        <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl" />
        <bean id="userService" class="com.bjsxt.service.UserService" >
            <property name="userDAO" bean="u"/>
        </bean>
    </beans>

     

    读xml文件:

     

    package com.bjsxt.spring;

    public interface BeanFactory {
        public Object getBean(String id);
    }

     

    package com.bjsxt.spring;


    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.input.SAXBuilder;

    public class ClassPathXmlApplicationContext implements BeanFactory {
       
        private Map<String , Object> beans = new HashMap<String, Object>();
       
       
        //IOC Inverse of Control DI Dependency Injection
        public ClassPathXmlApplicationContext() throws Exception {
            SAXBuilder sb=new SAXBuilder();
           
            Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); //构造文档对象
            Element root=doc.getRootElement(); //获取根元素HD
            List list=root.getChildren("bean");//取名字为disk的所有元素
            for(int i=0;i<list.size();i++){
               Element element=(Element)list.get(i);
               String id=element.getAttributeValue("id");
               String clazz=element.getAttributeValue("class");
               Object o = Class.forName(clazz).newInstance();
               System.out.println(id);
               System.out.println(clazz);
               beans.put(id, o);
              
               for(Element propertyElement : (List<Element>)element.getChildren("property")) {
                   String name = propertyElement.getAttributeValue("name"); //userDAO
                   String bean = propertyElement.getAttributeValue("bean"); //u
                   Object beanObject = beans.get(bean);//UserDAOImpl instance
                  
                   String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
                   System.out.println("method name = " + methodName);
                  
                   Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
                   m.invoke(o, beanObject);
               }
              
              
            } 
         
        }

     

        public Object getBean(String id) {
            return beans.get(id);
        }

    }

  • 相关阅读:
    在HttpHandlers (ASHX files)中使用Session
    EventCalendar控件源码和ASP.NET 2.0 Beta 2 Starter Kits中可能遇到的问题
    C# 获取数据库中某个某个表的创建脚本[原创]
    Linq 合并多个查询条件
    自定义WCF RIA Services 超时时间
    也来学学插件式开发续利用MEF
    HTML5程序设计 Geolocation API
    反射实体模型生成Oracle SQL脚本
    Entity Framework With Oracle
    Entity Framework Code First在Oracle下的伪实现
  • 原文地址:https://www.cnblogs.com/flying607/p/3484924.html
Copyright © 2011-2022 走看看