一、spring入门,IOC工作原理

1)首先需要获取当前线程的类装载器对象
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
2)从class目录中下获取指定的xml文件,装载到当前的线程的输入流中
InputStream ins = classLoader.getResourceAsStream(xml);
3)创建读取配置文件的reader对象,特定文档的解析工具
SAXReader reader = new SAXReader();
4)用创建的reader对象开始读取流文件,将其转换为正常文档类型
Docment doc = reader.reader(ins);
5)读取文档root元素:Element root = doc.getRootElement();

实例:
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/*
 * spring的IOC工作原理
 * 初始化顺序:1)创建配置文件2)装配配置文件3)启动IoC容器4)获取Bean实例
 * 
 * */
public class BeanFactory {

private Map<String, Object> beanMap = new HashMap<String, Object>();

/**
 * bean工厂的初始化.
 * 
 * @param xml xml配置文件
 */
public void init(String xml) {
    try {
        //1.创建读取配置文件的reader对象
        SAXReader reader = new SAXReader();

        //2.获取当前线程中的类装载器对象
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

        //3.从class目录下获取指定的xml文件
        InputStream ins = classLoader.getResourceAsStream(xml);
        Document doc = reader.read(ins);
        Element root = doc.getRootElement();
        Element foo;

        //4.遍历xml文件当中的Bean实例
        for (Iterator i = root.elementIterator("bean"); i.hasNext();) {
            foo = (Element) i.next();

            //5.针对每个一个Bean实例,获取bean的属性id和class
            Attribute id = foo.attribute("id");
            Attribute cls = foo.attribute("class");

            //6.利用Java反射机制,通过class的名称获取Class对象
            Class bean = Class.forName(cls.getText());
            //7.获取对应class的信息,javaBean的信息
            java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean);
            //8.获取其属性描述
            java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors();

            //9.创建一个对象,并在接下来的代码中为对象的属性赋值
            Object obj = bean.newInstance();

            //10.遍历该bean的property属性
            for (Iterator ite = foo.elementIterator("property"); ite.hasNext();) {
                Element foo2 = (Element) ite.next();

                //11.获取该property的name属性
                Attribute name = foo2.attribute("name");
                String value = null;

                //12.获取该property的子元素value的值
                for (Iterator ite1 = foo2.elementIterator("value"); ite1.hasNext();) 
                {
                    Element node = (Element) ite1.next();
                    value = node.getText();
                    break;
                }

                //13.利用Java的反射机制调用对象的某个set方法,并将值设置进去 
                for (int k = 0; k < pd.length; k++) {
                    if (pd[k].getName().equalsIgnoreCase(name.getText())) 
                    {
                        Method mSet = null;
                        mSet = pd[k].getWriteMethod();
                        mSet.invoke(obj, value);
                    }
                }
            }

            //14.将对象放入beanMap中,其中key为id值,value为对象
            beanMap.put(id.getText(), obj);
        }
    } catch (Exception e) {
        System.out.println(e.toString());
    }
}

/**
 * 通过bean的id获取bean的对象.
 * 
 * @param beanName
 *            bean的id
 * @return 返回对应对象
 */
public Object getBean(String beanName) {
    Object obj = beanMap.get(beanName);
    return obj;
}

/**
 * 测试方法.
 * 
 * @param args
 */
public static void main(String[] args) {
    BeanFactory factory = new BeanFactory();
    factory.init("conf/config.xml");
    JavaBean javaBean = (JavaBean) factory.getBean("javaBean");
    System.out.println("userName=" + javaBean.getUserName());
    System.out.println("password=" + javaBean.getPassword());
}
}


xml文件:config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="javaBean" class="com.jike.spring.chapter03.reflect.JavaBean">
       <property name="userName">
           <value>个人实例</value>
       </property>
       <property name="password">
           <value>1234567890</value>
       </property>
    </bean>

注:该代码为本人学习过程中的实验代码,谈不上原创,如有侵权请指出第一时间改正

猜你喜欢

转载自blog.csdn.net/qqb67g8com/article/details/81056360