模拟spring容器实例化

来源:互联网 发布:scratch少儿趣味编程 编辑:程序博客网 时间:2024/06/06 08:40
package com.springContext;public class SpringBean {private String id ;private String className ;public SpringBean(String id, String className) {super();this.id = id;this.className = className;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}}
package com.springContext;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.DocumentException;import org.dom4j.Element;import org.dom4j.XPath;import org.dom4j.io.SAXReader;public class LuweiClassPathXmlApplicationContext {private List<SpringBean> beans = new ArrayList<SpringBean>() ;private Map<String, Object> sigletons = new HashMap<String, Object>() ;public LuweiClassPathXmlApplicationContext(String fileName) {this.readXmlFile(fileName);//读取xml配置文件this.instanceBean() ;}private void instanceBean(){//反射技术实例化beanfor(SpringBean springBean:beans){if(springBean.getClassName()!=null&&!"".equals(springBean.getClassName().trim())){try {sigletons.put(springBean.getId(), Class.forName(springBean.getClassName()).newInstance()) ;//反射技术} catch (Exception e) {e.printStackTrace();}}}}private void readXmlFile(String fileName){SAXReader reader = new SAXReader() ; Document document =null;URL xmlPath = this.getClass().getClassLoader().getResource(fileName) ;try {document = reader.read(xmlPath) ;} catch (DocumentException e) {e.printStackTrace();}Map<String, String> nsMap = new HashMap<String, String>() ;nsMap.put("ns", "http://www.springframework.org/schema/beans") ;//加入命名空间XPath xPath = document.createXPath("//ns:beans/ns:bean") ;//创建beans/bean查询路径xPath.setNamespaceURIs(nsMap) ;//设置命名空间//获取文档下的所有bean节点List<Element> elements = xPath.selectNodes(document) ;for(Element element:elements){String id = element.attributeValue("id") ;String className = element.attributeValue("class") ;SpringBean bean = new SpringBean(id, className) ;beans.add(bean);}}public Object getBean(String beanName){return sigletons.get(beanName) ;}}

进行代码的测试:

//使用自己写的类进行模拟spring框架的作用//LuweiClassPathXmlApplicationContext luweiClassPathXmlApplicationContext = new LuweiClassPathXmlApplicationContext("applicationContext.xml") ;//AdminService adminService = (AdminService) luweiClassPathXmlApplicationContext.getBean("adminService") ;



原创粉丝点击