模拟spring的bean工厂,主要涉及到的角色:
1: 抽象产品角色 由Moveable.java来充当
2: 具体产品角色 由Car.java类和Train.java来充当
3:抽象工厂角色 由BeanFactory.java 接口来充当
4: 具体工厂角色 由ClasspathXmlApplicationContext.java来实现,用来从classpath的类路径读取文件
在这里主要使用dom4j的方式来解析xml文件,具体代码如下:
抽象产品角色:
/**
*
*/
package com.gd.spring.factory;
/**
* @author sandy
* 抽象产品类Moveable 可移动的
*/
public interface Moveable {
void moving();
}
具体产品角色:
/**
*
*/
package com.gd.spring.factory;
/**
* @author sandy
* 具体产品类角色
*/
public class Car implements Moveable {
/* (non-Javadoc)
* @see com.cn.gd.spring.factory.Moveable#moving()
*/
public void moving() {
System.out.println("汽车启动..........................");
}
}
/**
*
*/
package com.gd.spring.factory;
/**
* @author sandy
*
*/
public class Train implements Moveable {
/* (non-Javadoc)
* @see com.cn.gd.spring.factory.Moveable#moving()
*/
public void moving() {
System.out.println("火车冒着烟开始启动。。。。。。。。。。。。。。。。");
}
}
抽象工厂角色:
package com.gd.spring.factory;
/**
*
* @author sandy
* 抽象bean工厂
*/
public interface BeanFactory {
Object getBean(String id);
}
具体工厂角色:
/**
*
*/
package com.gd.spring.factory;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
* @author sandy
* 从classpath环境配置读取配置文件 该类实现了Bean工厂接口
*/
public class ClasspathXmlApplicationContext implements BeanFactory {
//定义一个存放bean信息的容器
private Map<String, Object> container = new HashMap<String, Object>();
//把传进来fileName文件用dom4j的方式解析,把解析后的结果放到容器container中
public ClasspathXmlApplicationContext(String fileName) {
SAXReader reader = new SAXReader();
Document document;
try {
document = reader.read(this.getClass().getClassLoader()
.getResourceAsStream(fileName));
Node root = document.selectSingleNode("/beans");
List list = root.selectNodes("bean");
for (Object o : list) {
Element element = (Element) o;
String beanId = element.attributeValue("id");
Object clazz = Class.forName(element.attributeValue("class"))
.newInstance();
container.put(beanId, clazz);
}
} catch (DocumentException e1) {
e1.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//根据beanId来从容器中获得bean的实例
public Object getBean(String beanId) {
return container.get(beanId);
}
}
客户端测试代码:
/**
*
*/
package com.gd.spring.factory;
/**
* @author sandy
* 模拟spring客户端调用程序
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
init();
}
private static void init() {
//加载 applicationContext.xml配置文件
BeanFactory factory = new ClasspathXmlApplicationContext(
"applicationContext.xml");
Object o = factory.getBean("v");
Moveable m = (Moveable) o;
m.moving();
}
}
applicationContext.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="v" class="com.gd.spring.factory.Car"></bean> </beans>
若想调用产品train的moving方法,则只需要在上面的applicationContext.xml中添加Train的配置信息即可入如下所示:
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="v" class="com.gd.spring.factory.Car"></bean> <bean id="train" class="com.gd.spring.factory.Train"></bean> </beans>
然后在客户端只需要调用beanId为train的bean即可,附件儿中是完整的程序that's all!