Spring ioc xml 实例化bean 自己实现

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");
    }
}

 

posted @ 2019-07-08 15:59  Chris,Cai  阅读(326)  评论(0编辑  收藏  举报