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;
}
}