先附一下编写的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类都在上篇博客。