简单模拟Spring的beanFactory
模拟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" name="code"><?xml version="1.0" encoding="UTF-8"?><beans><bean id="v" class="com.gd.spring.factory.Train"></bean></beans>
?
然后在客户端只需要调用beanId为train的bean即可,附件儿中是完整的程序that's? all!
?
?
?