Spring容器的原理,其实就是通过解析xml文件,或取到用户配置的bean,然后通过反射将这些bean挨个放到集合中,然后对外提供一个getBean()方法,以便我们获得这些bean。下面是一段简单的模拟代码:
package com.tgb.spring.factory;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
public class ClassPathXmlApplicationContext implements BeanFactory {
//容器的核心,用来存放注入的Bean
private Map container = new HashMap();
//解析xml文件,通过反射将配置的bean放到container中
public ClassPathXmlApplicationContext(String fileName) throws Exception{
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream(fileName));
Element root = doc.getRootElement();
List list = XPath.selectNodes(root, "/beans/bean");
//扫描配置文件中的bean
for (int i = 0; i < list.size(); i++) {
Element bean = (Element) list.get(i);
http://dfeej.info;
http://rtkuh.info;
http://xrtyf.info;
http://qefky.info;
http://whjir.info;
http://dfew.info;
http://cbjya.info;
http://qwfgr.info;
http://kuyhb.info;
http://qjyt.info;
http://wrtu.info;
http://xdes.info;
http://mkoy.info;
http://txbf.info;
http://wfkm.info;
http://njer.info;
http://www.dfeej.info;
http://www.rtkuh.info;
http://www.xrtyf.info;
http://www.qefky.info;
http://www.whjir.info;
http://www.dfew.info;
http://www.cbjya.info;
http://www.qwfgr.info;
http://www.kuyhb.info;
http://www.qjyt.info;
http://www.wrtu.info;
http://www.xdes.info;
http://www.mkoy.info;
http://www.txbf.info;
http://www.wfkm.info;
http://www.njer.info;
http://yuip.info;
http://fwqw.info;
http://hyui.info;
http://q237.info;
http://www.yuip.info;
http://www.fwqw.info;
http://www.hyui.info;
http://www.q237.info;
http://gsfea.info;
http://swzsa.info;
http://123wb.info;
http://ts235.info;
http://dt098.info;
http://sbr69.info;
http://xdfth.info;
http://dft2.info;
http://dvny6.info;
http://rh5n.info;
String id = bean.getAttributeValue("id");
String clazz = bean.getAttributeValue("class");
Object o = Class.forName(clazz).newInstance();
container.put(id, o);
}
}
@Override
public Object getBean(String id) {
return container.get(id);
}
}
首先声明一个存放bean的Map,然后通过jdom解析配置文件,循环遍历所有的节点,并通过反射将它们放到我们之前声明的Map中。然后提供一个getBean()的方法,让我们可以通过bean的Id来找到我们想要的bean。
下面是一个简单的xml配置文件: