先附一下编写的Spring容器的执行结果:
代码如下:
模拟的Spring容器类:
packagezmcSpring;
importjava.net.URL;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importorg.dom4j.Document;
importorg.dom4j.Element;
importorg.dom4j.XPath;
importorg.dom4j.io.SAXReader;
/*
* 简单模拟Spring容器
*/
publicclassZmcClassPathXMLApplicationContext{
privateList<BeanDefinition>beanDefines=newArrayList<BeanDefinition>();
privateMap<String,Object>sigletons=newHashMap<String,Object>();
publicZmcClassPathXMLApplicationContext(StringfileName){
this.readXML(fileName);
this.instanceBeans();
}
/*
* 完成bean的实例化
*/
privatevoidinstanceBeans(){
for(BeanDefinition beanDefinition:beanDefines){
try{
sigletons.put(beanDefinition.getId(),Class.forName(beanDefinition.getClassName()).newInstance());
}catch(InstantiationExceptione){
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IllegalAccessExceptione){
// TODO Auto-generated catch block
e.printStackTrace();
}catch(ClassNotFoundExceptione){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* 读取XMl配置文件
* @param filename
*/
publicvoidreadXML(StringfileName){
SAXReader saxReader=newSAXReader();
Document document=null;
try{
URL xmlpath=this.getClass().getClassLoader().getResource(fileName);
document=saxReader.read(xmlpath);
Map<String,String>nsMap=newHashMap<String,String>();
nsMap.put("ns","http://www.springframework.org/schema/beans");//加入命名空间
XPath xsub=document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径
xsub.setNamespaceURIs(nsMap);//设置命名空间
List<Element>beans=xsub.selectNodes(document);
for(Element element:beans){
Stringid=element.attributeValue("id");
Stringclazz=element.attributeValue("class");
BeanDefinition beanDefinition=newBeanDefinition(id,clazz);
beanDefines.add(beanDefinition);
}
}
catch(Exceptione){
e.printStackTrace();
}
}
/*
* 获取bean实例
*/
publicObjectgetBean(StringbeanName){
returnthis.sigletons.get(beanName);
}
}
存取bean信息的类:
packagezmcSpring;
publicclassBeanDefinition{
privateStringid;
privateStringclassName;
publicBeanDefinition(){
super();
}
publicBeanDefinition(Stringid,StringclassName){
super();
this.id=id;
this.className=className;
}
publicStringgetId(){
returnid;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicStringgetClassName(){
returnclassName;
}
publicvoidsetClassName(StringclassName){
this.className=className;
}
}
测试类:
packageTest;
importorg.junit.BeforeClass;
importorg.junit.Test;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
importzmcSpring.ZmcClassPathXMLApplicationContext;
importzmcjk.PersonService;
publicclassSpringD{
@BeforeClass
publicstaticvoidsetUpBeforeClass()throwsException{
}
@Test
publicvoidT(){
ZmcClassPathXMLApplicationContext zmc=newZmcClassPathXMLApplicationContext("beans.xml");
PersonService ps=(PersonService)zmc.getBean("personService");
ps.save();
/*ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
PersonService ps = (PersonService) ctx.getBean("personService");
ps.save();*/
}
}
PS:配置文件及bean类都在上篇博客。