Spring IOC实例化Bean模拟

Sring IOC实例化Bean模拟

package com.shsxt.spring;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * IOC bean对象实例化模拟
 * 1.提供构造器,传入待解析的xml文件名
 * 2.解析xml,获取bean标签的id和class
 * 3.实例化对应的对象
 * 4.对外提供获取对象的方法
 *
 * @author リュウゼツラン
 * @date 2019/10/17 18:55
 */
public class SxtClassPathXmlApplicationContext implements SxtBeanFactory {
    private Map<String,Object> results = new HashMap<String, Object>();
    private List<SxtBean> beans;
    //1.提供构造器,传入待解析的xml文件名
    public SxtClassPathXmlApplicationContext(String fileName) {
        //2.解析xml,获取bean标签的id和class
        this.parthXml(fileName);
        //3.实例化对应的对象
        this.instanceBean();
    }

    //将每个实例化对象存入map集合
    private void instanceBean() {
        if(beans != null && beans.size()>0){
            for(SxtBean bean : beans){
                try {
                    results.put(bean.getId(),Class.forName(bean.getClazz()).newInstance());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void parthXml(String fileName) {
        //(1)通过类加载器获取xml的路径url
        URL url = this.getClass().getClassLoader().getResource(fileName);
        //(2)获取saxreader
        SAXReader reader = new SAXReader();
        try {
            //(3)读取xml为文档文件
            Document document = reader.read(url);
            //(4)指定标签匹配节点
            XPath xPath = document.createXPath("beans/bean");
            List<Element> elements = xPath.selectNodes(document);
            if(null != elements && elements.size()>0){
                beans = new ArrayList<SxtBean>();
                for (Element element : elements){
                    //(5)遍历节点集合,取出每个节点的属性值,并存到SxtBean中
                    beans.add( new SxtBean(element.attributeValue("id"),element.attributeValue("class")));
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    //4.对外提供获取对象的方法
    @Override
    public Object getBean(String beanName) {
        return results.get(beanName);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值