Spring解析xml理解

Sprign解析xml配置使用dom4j.

第一步:获取Document

public class DocumentHelper{    
    //声明map存放节点
    private Map<String, Document> docs = new HashMap<String, Document>();
    public Document getDocument(String filePath) {
        //用HashMap先根据路径获取文档
        Document doc=this.docs.get(filePath); 
        if (doc==null) {
            //dom4j的解析得到doc
            …    
            this.docs.put(filePath, doc); //如果为空,把路径和文档放进去      
        } 
        return  this.docs.get(filePath);
    }
}

第二步:获取Element

public class ElementHelper{
    //声明map存放节点
    private Map<String, Element> elements=new HashMap<String, Element>();
    //往集合增加元素
    public void addElements(Document doc) {
        //获取document的elements节点,并且放入集合中
        …
    }
    //获取集合元素
    public Element getElement(String id) {
        return elements.get(id);
}
//获取所有的元素
Collection<Element> getElements(){…}
}

第三步:Bean的创造

public class BeanCreatorHelper{
    //空构造器
    public Object createBeanUseDefaultConstruct(String className) {
        return = Class.forName(className).newInstance();
    }
    //执行方法
    …
    //其他set方法还原等等
    …
}

第四步:applicationContext简单实现

public class ApplicationContextHelper {
    protected ElementHelper elementHelper = new ElementHelper();
    protected Map<String, Object> beans = new HashMap<String, Object>();
    //获取具体的对象实例,也是我们使用Spring框架中用的最多的一个方法
    public Object getBean(String id) {
    Object bean = this.beans.get(id);
    if (bean == null) {
        //1、获取到配置文件中的节点
        Element e = elementHelper.getElement(id);
        //2、通过bean创造器BeanCreatorHelper,通过反射机制获得对象,并且放到map集合中。
        ...
    }
    return bean;
}

总结

从Document的创造,再到Element的创建,再到解析Element,到applicationContext的实现。这一过程在编码中是按照顺序进行的,是不可逆的。真正的代码结构远比我上面提到的要复杂的很多。比如applicationContextHelper中,还有其他的自动注入方法等等,需要更深入的了解。

485 声望
14 粉丝
0 条评论
推荐阅读
Spring事务传播行为详解
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱,使用事务传播行可...

JerryTse242阅读 122.7k评论 97

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go32阅读 2.4k评论 1

封面图
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬14阅读 1.7k

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.6k

封面图
花了半个小时基于 ChatGPT 搭建了一个微信机器人
相信大家最近被 ChatGPT 刷屏了,其实在差不多一个月前就火过一次,不会那会好像只在程序员的圈子里面火起来了,并没有被大众认知到,不知道最近是因为什么又火起来了,而且这次搞的人尽皆知。

Java极客技术12阅读 3.1k评论 3

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.2k

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go11阅读 2.7k评论 4

封面图
485 声望
14 粉丝
宣传栏