核心代码 :
package org.rejoy.spring;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
import org.rejoy.spring.bean.BeanDefinition;
import org.rejoy.spring.bean.PropertyDefinition;
public class ClassPathXMLApplicationContext {
private List<BeanDefinition> beanDefinitions = new ArrayList<BeanDefinition>();
private Map<String, Object> beanMap = new HashMap<String, Object>();
public ClassPathXMLApplicationContext(String fileName) {
this.readXML(fileName);
this.instanceBeans();
this.injectObject();
}
private void injectObject() {
for (BeanDefinition beanDefinition : beanDefinitions) {
Object bean = beanMap.get(beanDefinition.getId());
if (bean != null) {
try {
PropertyDescriptor[] ps = Introspector.getBeanInfo(
bean.getClass()).getPropertyDescriptors();
for (PropertyDefinition propertyDefinition : beanDefinition
.getProperties()) {
for (PropertyDescriptor properdesc : ps) {
if (propertyDefinition.getName().equals(
properdesc.getName())) {
Method setter = properdesc.getWriteMethod();// 获取属性的setter方法
if (setter != null) {
Object value = beanMap
.get(propertyDefinition.getRef());
setter.setAccessible(true);
setter.invoke(bean, value);// 把引用对象注入到属性
}
break;
}
}
}
} catch (Exception e) {
}
}
}
}
private void instanceBeans() {
for (BeanDefinition beanDefinition : beanDefinitions) {
try {
if (beanDefinition.getClassName() != null
&& !"".equals(beanDefinition.getClassName()))
beanMap.put(beanDefinition.getId(), Class.forName(
beanDefinition.getClassName()).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@SuppressWarnings("unchecked")
private void readXML(String fileName) {
SAXBuilder saxBuilder = new SAXBuilder();
try {
Document document = saxBuilder.build(this.getClass()
.getClassLoader().getResourceAsStream(fileName));
Element root = document.getRootElement();
List<Element> list = XPath.selectNodes(root, "//beans/bean");
for (Element element : list) {
String id = element.getAttributeValue("id");
String clazz = element.getAttributeValue("class");
BeanDefinition beanDefinition = new BeanDefinition(id, clazz);
List<Element> properties = XPath.selectNodes(root,
"//beans/bean/property");
for (Element property : properties) {
String propertyName = property.getAttributeValue("name");
String propertyRef = property.getAttributeValue("ref");
PropertyDefinition propertyDefinition = new PropertyDefinition(
propertyName, propertyRef);
beanDefinition.getProperties().add(propertyDefinition);
}
beanDefinitions.add(beanDefinition);
}
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public Object getBean(String beanName) {
return beanMap.get(beanName);
}
}