大四狗闲的没事,设计实现SPRING 的BEANFACTORY

在一家公司实习,用到了SPRING 框架,感觉自己也能实现这样的框架,就这么决定了,一步步满满实现它(虽然十有八九会失败。。)

先试一下实现 BEANFACTORY 吧

首先试着解析这样的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>

<bean id="base" class="com.lee.bean.BaseBean">
<property  id="sub"  ref="sub" />
</bean>

<bean id="sub" class="com.lee.bean.SubBean"/>

</beans>
其中 base中有一个属性为sub,为是d=sub SubBean的引用


实现的代码如下:

package beanfactory;

import java.io.File;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.lee.bean.BaseBean;
import com.lee.bean.SubBean;

public class BeanFactory {
	private static Map<String, Object> map = null;
	private static SAXReader sax = null;
	private static Document doc = null;
	static {
		init();
	}

	/*
	 * 获取BEAN
	 */
	public static Object getBean(String name) throws Exception {
		Object obj = map.get(name);
		if (obj == null)
			throw new Exception("NO SUCH BEAN");
		return obj;
	}

	/*
	 * 初始化BEAN工厂
	 */
	public static void init() {
		try {
			if (map == null)
				map = new HashMap<String, Object>();
			sax = new SAXReader();
			File f = new File(BeanFactory.class.getClassLoader()
					.getResource("config/config.xml").toURI());
			doc = sax.read(f);
			Element root = doc.getRootElement();
			generateBeans(root);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception {

		SubBean sub = (SubBean) BeanFactory.getBean("sub");
		sub.sayHello();

		BaseBean base = (BaseBean) BeanFactory.getBean("base");
		base.sayHello();
		base.getSub().sayHello();
	}
   /*
    * 解析config.xml 生成BEAN
    */
	private static void generateBeans(Element root) throws Exception {
		List<?> lst = root.elements();

		for (int i = 0; i < lst.size(); i++) {

			Element e = (Element) lst.get(i);
			generateBean(e);

			List<?> list = e.elements();
			//处理引用BEAN  
			for (int j = 0; j < list.size(); j++) {
				Element ee = (Element) list.get(j);
				String name = ee.attributeValue("id");//得到属性名称
				String ref = ee.attributeValue("ref");//获取引用id
				Object sub = map.get(ref);
				if (sub == null) {
					Element se = (Element) (doc
							.selectSingleNode("beans/bean[@id='" + ref + "']"));
					sub = generateBean(se);
				}

				String clazz = e.attributeValue("class");
				Class<?> clz = Class.forName(clazz);

				Object base = map.get(e.attributeValue("id"));
				String set = name.substring(0, 1).toUpperCase()
						+ name.substring(1);
				Method method = clz.getDeclaredMethod("set" + set,
						new Class[] { sub.getClass() });
				method.invoke(base, new Object[] { sub });//反射实现赋值
			}

		}

	}
   /*
    * 生成单个BEAN
    */
	private static Object generateBean(Element e) throws Exception {
		String name = e.attributeValue("id");
		if (map.get(name) != null)
			return null;
		String clazz = e.attributeValue("class");
		Object obj = Class.forName(clazz).newInstance();
		map.put(name, obj);
		return obj;
	}
}
OK了 代码注释略少,但是关键地方还是有的。
因为本人没有什么工程经验,所以只是按着自己的理解来实现的,希望大家能够指出不足。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值