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<String , Object> beans = new HashMap<String, Object>();
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<Element> children =(List<Element>) 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,修改起来方便,不用硬性的修改代码。