spring ioc的原理就是通过解析xml文件,然后通过反射机制创建我们所需要的类的实例,这些实例放在一个“”容器“”中
测试xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="son" class="com.zwk.ioc.Son"/>
<bean id="father" class="com.zwk.ioc.Father">
<property name="son" ref="son"/>
</bean>
</beans>
解析xml文件的类如下,使用DOM解析来解析xml文件
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class ClassPathXmlApplicationContext {
private Map<String,Object> beanFactory=new HashMap<String,Object>();
public ClassPathXmlApplicationContext(String path)throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(path);
NodeList beans=document.getElementsByTagName("bean");
Element element;
String id;
String clazz;
Object obj;
Element property;
String name;
String ref;
for(int i=0;i<beans.getLength();i++){
element=(Element) beans.item(i);
id=element.getAttribute("id");
clazz=element.getAttribute("class");
obj=Class.forName(clazz).newInstance();
beanFactory.put(id, obj);
NodeList childNodes=element.getChildNodes();
for(int j=0;j<childNodes.getLength();j++){
property=(Element) childNodes.item(i);
name=property.getAttribute("name");
ref=property.getAttribute("ref");
String methodName = "set" + name.substring(0, 1).toUpperCase()
+ name.substring(1);
// 反射机制对方法进行调用,将对象在加载bean时就注入到环境上下文中
Method m = obj.getClass().getMethod(methodName,
this.getBean(ref).getClass());
// 执行注入,相当于执行了一个setXXX()的方法
m.invoke(obj, this.getBean(ref));
}
}
}
public Object getBean(String id){
return beanFactory.get(id);
}
}
基本的javabean如下
public class Son {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Father {
private String name;
private Son son;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Son getSon() {
return son;
}
public void setSon(Son son) {
this.son = son;
}
}
测试代码如下:
public class Test {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext beans=new ClassPathXmlApplicationContext("src/beans.xml");
System.out.println(beans.getBean("son"));
System.out.println(((Father)beans.getBean("father")).getSon());
}
}