2021-11-11

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值