首页 > 代码库 > 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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。