简单模拟Spring的beanFactory

本文介绍了一个模拟Spring Bean工厂的实现,通过自定义的抽象产品、具体产品、抽象工厂及具体工厂角色,演示了如何利用DOM4J解析XML配置文件,并通过ClasspathXmlApplicationContext类加载配置,创建并获取Bean实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值