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(); }
可以发现两者都实现了正确的输出。