首页 > 代码库 > Spring(2)

Spring(2)

Spring容器是怎样管理bean的呢?

我们模拟Spring容器的内部实现:

(1) 读取Spring中的Bean配置文件


	//读取bean配置文件	public void readXml(String beanDir){		Document document = null;		try{			SAXReader sx = new SAXReader();			URL xmlPath = this.getClass().getClassLoader().getResource(beanDir);			document = sx.read(xmlPath);			Map<String,String>nsMap = new HashMap<String,String>();			nsMap.put("ns", "http://www.springframework.org/schema/beans");			XPath xp = document.createXPath("//ns:beans/ns:bean");			xp.setNamespaceURIs(nsMap);//设置命名空间			List<Element> el = xp.selectNodes(document);//获取文档下的所有节点			for(Element element:el){				String id = element.attributeValue("id");				String className  = element.attributeValue("class");				PeopleBean peopleBean = new PeopleBean(id,className);				list.add(peopleBean);			}		}catch(Exception e){			e.printStackTrace();		}	}

 2、实例化bean


 包含上部分的完整的代码为:

package junit.test;import java.io.StringReader;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.XPath;import org.dom4j.io.SAXReader;public class LearnCreateBean {		//bean数组	private List<PeopleBean>list = new ArrayList<PeopleBean>();	private Map<Object,Object>map = new HashMap<Object,Object>();			LearnCreateBean(String beanDir){		readXml(beanDir);		instanceBeans();	}	/**	 * 实例化bean	 */	public void instanceBeans(){		for (PeopleBean bean:list){			try {				map.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());			} catch (InstantiationException e) {				// TODO Auto-generated catch block				e.printStackTrace();			} catch (IllegalAccessException e) {				// TODO Auto-generated catch block				e.printStackTrace();			} catch (ClassNotFoundException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}	}		//读取bean配置文件	public void readXml(String beanDir){		Document document = null;		try{			SAXReader sx = new SAXReader();			URL xmlPath = this.getClass().getClassLoader().getResource("bean.xml");			document = sx.read(xmlPath);			Map<String,String>nsMap = new HashMap<String,String>();			nsMap.put("ns", "http://www.springframework.org/schema/beans");			XPath xp = document.createXPath("//ns:beans/ns:bean");			xp.setNamespaceURIs(nsMap);//设置命名空间			List<Element> el = xp.selectNodes(document);//获取文档下的所有节点			for(Element element:el){				String id = element.attributeValue("id");				String className  = element.attributeValue("class");				PeopleBean peopleBean = new PeopleBean(id,className);				list.add(peopleBean);			}		}catch(Exception e){			e.printStackTrace();		}	}		//		public Object getBeanU(String beanName){		return  this.map.get(beanName);	}	}

  

 3、 测试


	@Test	public void test() {		//实例化Spring容器		ApplicationContext ctx =  new ClassPathXmlApplicationContext("bean.xml");		PeopleService peopleService = (PeopleService)ctx.getBean("peopleService");		peopleService.testBeans();		//采用自定义的类来实例化bean		LearnCreateBean ctxd =  new LearnCreateBean("bean.xml");		PeopleService peopleServiced = (PeopleService)ctx.getBean("peopleService");		peopleService.testBeans();	}

可以发现两者都实现了正确的输出。

Spring(2)