1、读取config.xml文件的bean标签放入数组,读取内容包括id和class。
2、循环数组并根据class路径利用反射机制实例化Bean,并放入Map。
3、根据传入的BeanId获取Map中对应的bean实例。
package com.yt.core.yl; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.yt.spring.user.UserBean; /** * @Description: Spring管理Bean原理 * @ClassName: ClassPathXMLApplicationContext * @Project: spring-aop * @Author: zxf * @Date: 2011-6-3 */ public class ClassPathXMLApplicationContext { Logger log = Logger.getLogger(ClassPathXMLApplicationContext.class); List<BeanDefinition> beanList = new ArrayList<BeanDefinition>(); Map<String, Object> sigletions = new HashMap<String, Object>(); public ClassPathXMLApplicationContext(String fileName) { this.readXML(fileName); this.instancesBean(); } /** * 读取Bean配置文件 * * @param fileName * @return */ @SuppressWarnings("unchecked") public void readXML(String fileName) { Document document = null; SAXReader saxReader = new SAXReader(); try { ClassLoader classLoader = Thread.currentThread() .getContextClassLoader(); document = saxReader .read(classLoader.getResourceAsStream(fileName)); Element beans = document.getRootElement(); for (Iterator<Element> beansList = beans.elementIterator(); beansList .hasNext();) { Element element = beansList.next(); BeanDefinition bean = new BeanDefinition( element.attributeValue("id"), element.attributeValue("class")); beanList.add(bean); } } catch (DocumentException e) { log.info("读取配置文件出错...."); } } /** * 实例化Bean */ public void instancesBean() { for (BeanDefinition bean : beanList) { try { sigletions.put(bean.getId(), Class.forName(bean.getClassName()) .newInstance()); } catch (Exception e) { log.info("实例化Bean出错..."); } } } /** * 获取Map中的对应的bean实例 * @param beanId * @return */ public Object getBean(String beanId) { return sigletions.get(beanId); } public static void main(String[] args) { ClassPathXMLApplicationContext path = new ClassPathXMLApplicationContext( "config.xml"); UserBean userBean = (UserBean)path.getBean("userBean"); userBean.setUserName("zxf_noimp"); System.out.println(userBean.getUserName()); } }
package com.yt.core.yl; /** * @Description: * @ClassName: BeanDefinition * @Project: spring-aop * @Author: zxf * @Date: 2011-6-3 */ public class BeanDefinition { public String id; public String className; public BeanDefinition(String id, String className) { 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; } }