Spring IOC容器的简单实现

package com.imooc.spring.ioc.context;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ClassPathXmlApplicationContext implements ApplicationContext{
    //键对应beanId,作为值对应容器创建过程中产生的对象
    private Map iocContainer = new HashMap();
    //加载处理xml文件
    public ClassPathXmlApplicationContext(){
       //在对象初始化时,读取刚才初始化的xml文件、
        try{
            String filePath = this.getClass().getResource("/applicationContext.xml").getPath();
            filePath = new URLDecoder().decode(filePath, "UTF-8");
            //利用SAXReader解析加载这个filepath所对应的XML文件
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File(filePath));
            document.getRootElement().selectNodes("bean");
            List<Node> beans = document.getRootElement().selectNodes("bean");
            for(Node node:beans){
                Element ele = (Element)node;
                String id = ele.attributeValue("id");
                String className = ele.attributeValue("class");
                //接下来用反射技术进行对象实例化
                Class c = Class.forName(className);
                Object obj = c.newInstance();
                //在获取到对象以后,我们通过 得到每一个bean标签下的property,返回的是一个list。这个list中就包含了bean下的所有属性的值
                List <Node> properties = ele.selectNodes("property");
                for(Node p: properties){
                    Element property = (Element)p;
                    String propName = property.attributeValue("name");
                    String propValue = property.attributeValue("value");

                    String setMethodName = "set" + propName.substring(0, 1).toUpperCase() + propName.substring(1);
                    System.out.println("准备执行" + setMethodName + "方法注入数据");
                    Method setMethod = c.getMethod(setMethodName, String.class);
                    setMethod.invoke(obj, propValue); //通过setter方法注入数据

                }
                iocContainer.put(id, obj);
            }
            System.out.println(iocContainer);
            System.out.println("IOC初始化完毕");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @Override
    public Object getBean(String beanId) {
        return iocContainer.get(beanId);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值