Spring初级容器初始化:加载XML的Document

Spring是如何解析XML的呢?​

好了,我们接着方法doLoadBeanDefinitions继续分析:

我们可以看到,在方法doLoadBeanDefinitions中,首先将封装好的inputSource及资源resource传递进了doLoadDocument方法中,通过方法的名称应该是把resource资源加载成一个Document对象,确实我们也看到了它返回了一个Document对象。

到这个方法看下:

可以看到,XmlBeanDefinitionReader又将加载资源resource的任务,委托给了成员变量documentLoader来完成。那documentLoader又是什么呢?我们可以来看下这个成员变量:

可以看到,成员变量documentLoader的类型为DefaultDocumentLoader,通过类的名称,我们初步可以推测出它就是用来加载Document的一个组件。

loadDocument方法看一下。

看到这里几乎就真相大白了,Spring其实就是通过DOM来解析xml文件的

XML解析的示例:DOM解析

简单的实体 复制代码
package com.ruyuan.container;

public class Student {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
student.xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student>
        <name>tom</name>
        <age>17</age>
    </student>
</students>
获取Document 复制代码
public static Document getDocument(String xmlPath) throws Exception {
    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        return db.parse(xmlPath);
    } catch (Exception e) {
        throw new RuntimeException("文档解析失败...");
    }
}

首先,将xml文件的绝对路径,也就是xml文件在磁盘的位置,作为方法getDocument参数传递进去,然后通过DocumentBuilderFactory的newInstance方法,创建出一个DocumentBuilderFactory,再通过newDocumentBuilder方法得到DocumentBuilder对象。

可以看到,通过DocumentBuilder的parse方法解析xml文件,可以得到xml文件对应的Document对象,Document对象中就包含了student.xml中配置的所有信息。

方法getDocument暂时只是将指定路径下的xml文件加载成了Document对象,那具体如何解析Document对象,获取xml中配置的信息呢?我们再通过另外一个方法来解析下Document:

ini 复制代码
public static List<Student> getStudents(String xmlPath) throws Exception {
    // 1. 获取Document对象
    Document document = getDocument(xmlPath);

    // 2. 获取所有student节点
    List<Student> students = new ArrayList<>();
    NodeList studentNodes = document.getElementsByTagName("student");

    // 3. 遍历节点并解析数据
    for (int i = 0; i < studentNodes.getLength(); i++) {
        Element studentEle = (Element) studentNodes.item(i);
        Student student = new Student();
        student.setName(studentEle.getElementsByTagName("name")
                .item(0).getTextContent());
        student.setAge(Integer.parseInt(studentEle.getElementsByTagName("age")
                .item(0).getTextContent()));
        students.add(student);
    }

    // 4. 返回结果
    return students;
}

可以看到,在getStudents方法中,我们调用刚才的getDocument方法先获取student.xml对应的Document对象,然后获取配置文件中的所有student标签依次来遍历它们,通过对student标签的解析获取标签中name标签和age标签中的数据,并封装到Student对象中返回。最后,我们再测试下刚才写的这些方法:

相关推荐
半路程序员1 分钟前
Go内存泄漏排查pprof和trace使用
开发语言·后端·golang
WongLeer3 分钟前
Go + GORM 多级分类实现方案对比:内存建树、循环查询与 Preload
开发语言·后端·mysql·golang·gorm
Victor3569 分钟前
Hibernate(34)Hibernate的别名(Alias)是什么?
后端
superman超哥12 分钟前
Rust HashMap的哈希算法与冲突解决:高性能关联容器的内部机制
开发语言·后端·rust·哈希算法·编程语言·冲突解决·rust hashmap
Victor35615 分钟前
Hibernate(33) Hibernate的投影(Projections)是什么?
后端
a程序小傲16 分钟前
【Node】单线程的Node.js为什么可以实现多线程?
java·数据库·后端·面试·node.js
奋进的芋圆9 小时前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端
计算机程序设计小李同学10 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
Echo娴10 小时前
Spring的开发步骤
java·后端·spring
追逐时光者10 小时前
TIOBE 公布 C# 是 2025 年度编程语言
后端·.net