Spring ioc xml 实例化bean 自己实现

本文介绍了一个自定义的Spring Bean加载器实现,通过解析XML配置文件,读取Bean定义并实例化相应的类。该加载器能够处理XML路径为空的情况,并在找不到对应类时抛出异常。
public class DefClassPathXmlApplicationContext {

    private String xmlPath;

    public DefClassPathXmlApplicationContext(String xmlPath) {
        this.xmlPath = xmlPath;
    }

    public Object getBean(String beanId) throws Exception {
        if (StringUtils.isEmpty(xmlPath)) {
            throw new Exception("xmlPath is null");
        }
        // 获取xml 元素
        List<Element> elements = readElementsFromXml(xmlPath);
        // 获取xml id 对应的class
        String clazzStr = findClassByBeanId(elements, beanId);

        if (StringUtils.isEmpty(clazzStr)) {
            throw new Exception("clazzStr 不存在");
        }
        Class<?> clazz = Class.forName(clazzStr);
        Constructor<?> constructor = clazz.getDeclaredConstructor();
        constructor.setAccessible(true);
        Object newInstance = constructor.newInstance();
        return newInstance;
    }

    private String findClassByBeanId(List<Element> elements, String beanId) {
        for (Element element : elements) {

            if (element.attributeValue("id") != null && element.attributeValue("id").equals(beanId)) {
                return element.attributeValue("class");
            }
        }
        return "";
    }

    private List<Element> readElementsFromXml(String xmlPath2) throws DocumentException {
        SAXReader saxReader = new SAXReader();
        // this.getClass().getClassLoader().getResourceAsStream(xmlPath)
        // 就是从src/main/resource 下读取
        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(xmlPath);
        Document read = saxReader.read(resourceAsStream);
        Element rootElement = read.getRootElement();

        List<Element> elements = rootElement.elements();
        if (elements.isEmpty()) {
            return null;
        }
        return elements;
    }

    public static void main(String[] args) throws Exception {
        DefClassPathXmlApplicationContext defClassPathXmlApplicationContext = new DefClassPathXmlApplicationContext(
                "spring.xml");
        Object bean = defClassPathXmlApplicationContext.getBean("userServiceImpl");
    }
}

 

转载于:https://www.cnblogs.com/pickKnow/p/11151768.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值