首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

简略模拟Spring的beanFactory

2012-10-13 
简单模拟Spring的beanFactory模拟spring的bean工厂,主要涉及到的角色:1:? 抽象产品角色?????? 由Moveable.

简单模拟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!

?

?

?

热点排行