spring 引用类型注入
xml文件
尝试自己写出parseXML方法(解析传递的xml文件)
package ioc;
import org.apache.commons.beanutils.PropertyUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.beans.PropertyDescriptor;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class ClassPathXmlApplicationContext implements ApplicationContext{
private String filename;
private Map<String,Object> map = new HashMap<>();
public ClassPathXmlApplicationContext(String filename){
this.filename=filename;
this.parseXML();
}
public Object getBeanMap(){
return this.map;
}
public Object getBean(String name){return map.keySet();}
private void parseXML(){
try {
SAXReader reader = new SAXReader();
Document document = reader.read(this.getClass().getClassLoader().getResourceAsStream(filename));
List<Node> beanList = document.selectNodes("beans/*");
if(beanList!=null&&beanList.size()>0){
for(Node node:beanList){
Element element =(Element) node;
String elementId = element.attributeValue("id");
String elementClass = element.attributeValue("class");
map.put(elementId,Class.forName(elementClass).newInstance());
}
}
Element root = document.getRootElement();
for(Iterator<Element> beans = root.elementIterator("bean");beans.hasNext();){
Element bean = (Element)beans.next();
String beanId = bean.attributeValue("id");
Object beanObj = map.get(beanId);
if(beanObj!=null){
PropertyDescriptor pds[]= PropertyUtils.getPropertyDescriptors(beanObj);
for(Iterator<Element> properties = bean.elementIterator("property");properties.hasNext();){
Element property = (Element)properties.next();
String propertyName = property.attributeValue("name");
for(PropertyDescriptor pd:pds){
if(pd.getName().equals(propertyName)){
String propertValue = property.attributeValue("value");
String propertRef = property.attributeValue("ref");
if(propertValue!=null){
pd.getWriteMethod().invoke(beanObj,propertValue);
}else{
for(Iterator<Element> beans2 = root.elementIterator("bean");beans2.hasNext();){
Element bean2 = (Element)beans2.next();
if(bean2.attributeValue("id").equals(propertRef)){
Object beanObj2=map.get(bean2.attributeValue("id"));
pd.getWriteMethod().invoke(beanObj,beanObj2);
}
}
}
}
}
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
pd.getWriteMethod().invok(Object1,Object2)
对象2通过写类方法public void setName(String name) { this.name = name; }
传递给对象1
传递类时对象2是(Element)bean