spring ioc的简单实现

来源:互联网 发布:制作动态图片的软件 编辑:程序博客网 时间:2024/05/01 02:05

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());}}


0 0