自己写一个简单的Spring IOC容器

为了能更好的理解SpirngIOC是如何工作的,在查阅网上的资料后,自己写了一个非常简单的SpringIOC容器,使用setter方法将值注入。

本例子需要用到jdom的包:http://pan.baidu.com/s/1hsmgsfi

以下是包结构

自己写一个简单的Spring IOC容器_第1张图片

A和B接口的定义就不不写类,很简单。

BeanFactory接口只有一个方法,根据id返回对应的bean:

package demo.myspring;

public interface BeanFactory {
	public Object getBean(String id);
}

AImpl代码,只有一个print方法:

package demo.myspring.impl;

import demo.myspring.A;

public class AImpl implements A {

	@Override
	public void print() {
		System.out.println("AImpl invoked!");
	}

}
BImpl代码,通过接口调用a的print方法,必须有setter方法,因为在IOC容器中会利用反射机制调用该方法:
package demo.myspring.impl;

import demo.myspring.A;

public class BImpl implements demo.myspring.B {
	A a;

	public void setA(A a) {
		this.a = a;
	}
	
	public void print(){
		System.out.println("BImpl invoked!");
		a.print();
	}
}

ClassPathXmlApplicationContext代码,主要是利用SAXBulider解析Bean.xml文件,在利用反射机制加载bean

package demo.myspring.core;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

import demo.myspring.BeanFactory;

public class ClassPathXmlApplicationContext implements BeanFactory {

	private Map beans = new HashMap();
	
	public ClassPathXmlApplicationContext() throws Exception{
		
		SAXBuilder sb = new SAXBuilder();//新建xml解析器
		
		Document xmlDoc = sb.build(this.getClass().getClassLoader().
					      getResourceAsStream("demo/myspring/conf/beans.xml"));//构造文档对象
		Element root = xmlDoc.getRootElement();//获取根元素
		List list = root.getChildren("bean");//获取根元素下所有名字为bean的元素
		
		//遍历所有的bean元素,并将其放入beans中
		for(int i = 0;i)e.getChildren("property")){
					String name = p.getAttributeValue("name");
					String bean = p.getAttributeValue("bean");
					Object beanObject = beans.get(bean);
					String methodName = "set" + name.substring(0,1).toUpperCase()+ name.substring(1);
					System.out.println("setter method name = " +methodName);
					Method m = o.getClass().getMethod(methodName,beanObject.getClass().getInterfaces()[0]);
					m.invoke(o,beanObject);//调用setter方法
				}
			}	
		}		
	}
	
	public Object getBean(String id) {
		return beans.get(id);
	}

}
bean.xml文件:


	
	
		
	
测试类:

package demo.myspring.test;

import demo.myspring.B;
import demo.myspring.core.ClassPathXmlApplicationContext;

public class Test {
	public static void main(String[] args) throws Exception{
		ClassPathXmlApplicationContext cpxa = new ClassPathXmlApplicationContext();
		B b = (B) cpxa.getBean("b");
		b.print();
	}
}
测试类运行后,控制台输出如下信息

 id: a class: demo.myspring.impl.AImpl
 id: b class: demo.myspring.impl.BImpl
setter method name = setA
BImpl invoked!
AImpl invoked!




你可能感兴趣的:(Spring)