<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="userBean" class="com.szy.spring.implbean.UserBean" /> </beans>
Spring的配置文件中记录了类的包路径,因此我们首先是要读入配置文件。在配置文件中Bean有id和class两个属性,我们首先定义一个Bean类,包含这两个属性:
package com.szy.spring.implbean; public class Bean { private String id; private String 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; } }
由于配置文件是xml文件,在这里使用Jdom包操作xml文件,读入配置文件中的Bean信息。
/** * 读取xml配置文件 * @param fileName 配置文件名 */ private void readXML(String fileName) { // 寻找配置文件 URL xmlPath = this.getClass().getClassLoader().getResource(fileName); Document doc = null; Element root = null; try { SAXBuilder sb = new SAXBuilder(false); doc = sb.build(new FileInputStream(new File(xmlPath.toURI()))); // 设置命名空间 Namespace xhtml = Namespace.getNamespace("xhtml", "http://www.springframework.org/schema/beans"); root = doc.getRootElement(); // 获取根元素 List<Element> list = root.getChildren("bean", xhtml); //获取全部bean节点 for (Element element : list)// 遍历节点,取得每个节点的属性 { String id = element.getAttributeValue("id"); String className = element.getAttributeValue("class"); Bean bean = new Bean(); bean.setId(id); bean.setClassName(className); beanList.add(bean); } } catch (Exception e) { e.printStackTrace(); } }
其中beanList是一个List对象,因为在配置文件中存在很多Bean。
得到了所有的Bean对象后,下面就实例化每个Bean对象,结果存放在Map对象中。
/** * bean的实例化 */ private void instanceBeans() { for (Bean bean : beanList) { try { if (bean.getClassName() != null && !"".equals(bean.getClassName().trim())) beanObject.put(bean.getId(), Class.forName(bean.getClassName()).newInstance()); } catch (Exception e) { e.printStackTrace(); } } }
其中beanObject为Map对象。
最后再加入一个方法,方便外部能获取Map中的对象
/** * 获取bean实例 * @param beanName 配置文件中bean的Id * @return */ public Object getBean(String beanName) { return this.beanObject.get(beanName); }
完整的MyClassPathXMLApplicationContext见附件中的代码。
下面测试MyClassPathXMLApplicationContext类。
@Test public void testMethod() throws Exception { //读取配置文件 MyClassPathXMLApplicationContext ctx=new MyClassPathXMLApplicationContext("applicationContext.xml"); //获取UserBean的实例 PersonBean bean=(PersonBean)ctx.getBean("userBean"); //调用方法 bean.show(); }
输出结果
Hello Kuka
成功。
上面仅是简单的演示了Spring管理Bean的原理,但是在实际操作中还需要考虑很对其它因素。