1.首先讲解dom4j 解析XML的过程:

     1.引入jar包,jdom-1.1.jar。

    2.创建自己的解析类ClassPathXmlApplicationContext使用这个类来读取bean.xml的配置文件,实现BeanFactory,实现里面获取bean对象的方法:

 

package com.cn.springbean;


import java.io.File;

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{


@Override

public Object getBean(String beanName) {

// TODO Auto-generated method stub

return beans.get(beanName);

}

    //用Map容器存储bean的名字和值

    private Map beans = new HashMap();

public ClassPathXmlApplicationContext() throws Exception {

SAXBuilder sb = new SAXBuilder();

//构造文档对象

File file = new File("beans.xml");

System.out.println(file.getAbsolutePath());

        Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); 

        Element root= doc.getRootElement();

        List list=root.getChildren("bean");

        for (Object object : list) {

Element element = (Element) object;

String id= element.getAttributeValue("id");

String classname = element.getAttributeValue("class");

Object o = Class.forName(classname).newInstance();

beans.put(id, o);

// 用反射机制获取属性

List children =(List) element.getChildren("property");

for (Element element2 : children) {

String name = element2.getAttributeValue("name");

String valuebean = element2.getAttributeValue("bean");

Object beanObject= beans.get(valuebean);

String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);//通过这句话构造setUserDAO()方法

                System.out.println("method name = " + methodName);

                Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces());//setUserDAO(UserDao.class)

                m.invoke(o, beanObject);

}

}

}

}


IOC/DI原理:IOC(inverse of controll)控制反转:通过上面的例子可以看出,以前Service层中想调用Dao层中的方法,需要在Service层中new出来,是由自己控制的,而现在由Spring容器控制创建初始化bean(对象),维护bean与bean之间的关系,权利从程序中转移到了Spring容器,而程序本身不需要再维护。

DI(dependency injection)依赖注入:实际上和IOC是一个概念,为了更准确的描述Spring的核心技术,对象之间的关系是相互依赖的,一些通用的bean组件可以依赖容器注入进来。原理:也可以说成反射注入,通过使用解析XML技术,以及反射的机制,构造真实实例对象,构造set方法把userDAO这个bean注入到userService中。

好处:耦合性大大的降低,用配置文件注入bean,修改起来方便,不用硬性的修改代码。