Java-马士兵设计模式学习笔记-工厂模式-用Jdom模拟Spring

时间:2022-06-24 08:24:38

一、概述

1.目标:模拟Spring的Ioc

2.用到的知识点:利用jdom的xpath读取xml文件,反射

二、有如下文件:

1.applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="vehicle" class="com.tong.spring.factory.Car">
</bean>
</beans>

  

2.BeanFactory.java

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

  

3.ClassPathXmlApplicationContext.java

public class ClassPathXmlApplicationContext implements BeanFactory{

	private Map<String, Object> container = new HashMap<String, Object>();

	public ClassPathXmlApplicationContext(String fileName) {

		//读取xml文件
SAXBuilder sb = new SAXBuilder();
Document doc;
try {
//doc = sb.build(fileName);
//Test.java要改为BeanFactory factory = new ClassPathXmlApplicationContext("com/tong/spring/factory/applicationContext.xml");
//否则付出现“java.net.MalformedURLException”
doc = sb.build(this.getClass().getClassLoader().getResourceAsStream(fileName));
Element root = doc.getRootElement();
List list = XPath.selectNodes(root, "/beans/bean"); for (int i = 0; i < list.size(); i++) {
Element element = (Element) list.get(i);
String id = element.getAttributeValue("id");
String clazz = element.getAttributeValue("class"); // 利用反射生成例,然后装进容器
Object o = Class.forName(clazz).newInstance();
container.put(id, o);
}
} catch (Exception e) {
e.printStackTrace();
} } @Override
public Object getBean(String id) {
return container.get(id);
} }

  

4.Movable.java

public interface Movable {
void run();
}

  

5.Car.java

public class Car implements Movable {

	public void run() {
System.out.println("Car running...............");
} }

 

6.Test.java 

public class Test {

	@org.junit.Test
public void test() { //BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
BeanFactory factory = new ClassPathXmlApplicationContext("com/tong/spring/factory/applicationContext.xml");
Object o = factory.getBean("vehicle");
Movable m = (Movable)o;
m.run();
}
}

  

  

运行结果:

Java-马士兵设计模式学习笔记-工厂模式-用Jdom模拟Spring