Spring 核心技术解析【纯干货版】- XI:Spring 数据访问模块 Spring-Oxm 模块精讲

在现代 Java 开发中,XML 仍然是数据存储和数据交换的重要格式,特别是在 Web 服务、配置管理和数据持久化等场景中。Spring 框架提供了 Spring-OXM(Object/XML Mapping) 模块,旨在简化 Java 对象与 XML 之间的转换,并支持多种 OXM 实现,如 JAXB、Castor、XStream、JibX 等。

本篇文章深入解析了 Spring-OXM 模块的核心概念,并结合 JAXB 进行详细示例,展示如何在 Spring 项目中实现 Java 对象与 XML 的双向转换。同时,我们也探讨了 Spring-OXM 与 MyBatis 的关系,说明了在 MyBatis 场景下通常不需要引入 spring-oxm 模块。

无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解 Spring-OXM,并在实际开发中灵活运用 XML 映射技术。


文章目录

      • [1、Spring-Oxm 模块介绍](#1、Spring-Oxm 模块介绍)
        • [1.1、Spring-Oxm 模块概述](#1.1、Spring-Oxm 模块概述)
        • [1.2、Spring-Oxm 模块依赖](#1.2、Spring-Oxm 模块依赖)
        • [1.3、Spring-Oxm 模块作用](#1.3、Spring-Oxm 模块作用)
        • [1.4、Spring-Oxm 模块 不适用于 MyBatis](#1.4、Spring-Oxm 模块 不适用于 MyBatis)
      • [2、Spring oxm 集成 JAXB 并进行数据库操作的示例](#2、Spring oxm 集成 JAXB 并进行数据库操作的示例)
        • 2.1、添加依赖
        • [2.2、创建 Java 领域对象(Entity)](#2.2、创建 Java 领域对象(Entity))
        • [2.3、 配置 Spring-OXM(`oxm-config.xml`)](#2.3、 配置 Spring-OXM(oxm-config.xml))
        • [2.4、创建 OXM Service](#2.4、创建 OXM Service)
        • [2.5、测试 JAXB 序列化/反序列化](#2.5、测试 JAXB 序列化/反序列化)
        • 2.6、运行后输出
      • X、后记

1、Spring-Oxm 模块介绍

1.1、Spring-Oxm 模块概述

Spring OXM 模块,是一个关注于对象|XML 映射(Object|XML Mapping)的模块,它支持多种 OXM 实现,比如 JAXB、Castor、XMLBeans 等。这

Spring OXM 模块使得在 Spring 应用中处理XML数据变得容易,特别是当需要将 Java 对象转换为 XML 或者从 XML 反序列化为 Java 对象时。通过提供统一的 API,开发者可以灵活选择最适合他们应用场景的 OXM 技术。

1.2、Spring-Oxm 模块依赖

Spring-Tx 模块的依赖有两个,分别是 Spring-Beans 模块和 Spring-Core 模块。

其中 Spring Beans 模块是对 Spring Bean 进行定义,实现 IOC 基础功能的模块。而 Spring-Core 是 Spring 中的基础模块,它提供了框架运行所必需的核心功能。

1.3、Spring-Oxm 模块作用

spring-oxm(Spring Object/XML Mapping)是 Spring 提供的用于 对象-XML 映射 的模块,主要用于:

  • 统一封装不同的 XML 解析工具(如 JAXB、Castor、XStream、JibX 等)。
  • 在 Web 服务(如 Spring Web Services)或 XML 处理场景中使用。
  • 主要用于 OXM(Object-to-XML Mapping)相关的功能。
1.4、Spring-Oxm 模块 不适用于 MyBatis

在 Spring 集成 MyBatis 时 通常不需要 引入 spring-oxm 模块。

MyBatis 主要是 SQL 映射框架,而不是 XML 解析框架:

  • MyBatis 的 XML 配置文件(mybatis-config.xml 和 mapper.xml)是 基于标准 XML 解析 的,MyBatis 自身使用 JAXP 解析 XML,无需 spring-oxm。
  • MyBatis 也支持 纯 Java 配置(基于 @Mapper 注解),这完全不涉及 XML 解析。

2、Spring oxm 集成 JAXB 并进行数据库操作的示例

下面是一个 Spring-OXM 集成 JAXB 的示例,展示如何使用 spring-oxm 将 Java 对象转换为 XML(Marshalling)以及从 XML 转换回 Java 对象(Unmarshalling)。

2.1、添加依赖

添加以下 Maven 依赖:

xml 复制代码
<dependencies>
    <!-- Spring OXM -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-oxm</artifactId>
        <version>5.3.39</version>  <!-- 版本请根据你的 Spring 版本选择 -->
    </dependency>

    <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
        <version>4.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>4.0.3</version>
    </dependency>
</dependencies>
2.2、创建 Java 领域对象(Entity)

这里我们定义一个简单的 Person 类,并使用 JAXB 注解进行 XML 绑定。

java 复制代码
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "person")  // 指定 XML 根元素
public class Person {
    private String name;
    private int age;

    public Person() {}

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @XmlElement  // 指定 XML 元素
    public String getName() {
        return name;
    }

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

    @XmlElement
    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}
2.3、 配置 Spring-OXM(oxm-config.xml)

在 resources 目录下创建 oxm-config.xml,配置 Jaxb2Marshaller 作为 Spring-OXM 处理器。

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置 JAXB2 Marshaller -->
    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
            <list>
                <value>com.example.model.Person</value>
            </list>
        </property>
    </bean>

</beans>
2.4、创建 OXM Service

定义 XmlService,使用 Jaxb2Marshaller 进行 XML 序列化和反序列化。

java 复制代码
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import java.io.*;

public class XmlService {
    private final Jaxb2Marshaller marshaller;

    public XmlService(Jaxb2Marshaller marshaller) {
        this.marshaller = marshaller;
    }

    // Java 对象 -> XML
    public void convertObjectToXml(Object object, String filePath) throws IOException {
        try (FileOutputStream os = new FileOutputStream(filePath)) {
            marshaller.marshal(object, new StreamResult(os));
        }
    }

    // XML -> Java 对象
    public <T> T convertXmlToObject(String filePath, Class<T> clazz) throws IOException {
        try (FileInputStream is = new FileInputStream(filePath)) {
            return (T) marshaller.unmarshal(new StreamSource(is));
        }
    }
}
2.5、测试 JAXB 序列化/反序列化

创建 Main 方法来测试 XML 处理功能。

java 复制代码
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        // 加载 Spring XML 配置
        ApplicationContext context = new ClassPathXmlApplicationContext("oxm-config.xml");

        // 获取 Jaxb2Marshaller Bean
        Jaxb2Marshaller marshaller = (Jaxb2Marshaller) context.getBean("jaxb2Marshaller");

        // 创建 XmlService
        XmlService xmlService = new XmlService(marshaller);

        // 创建 Person 对象
        Person person = new Person("张三", 30);
        String filePath = "person.xml";

        try {
            // 1. Java 对象转换为 XML
            xmlService.convertObjectToXml(person, filePath);
            System.out.println("XML 文件生成成功:" + filePath);

            // 2. XML 解析回 Java 对象
            Person parsedPerson = xmlService.convertXmlToObject(filePath, Person.class);
            System.out.println("从 XML 解析的对象:" + parsedPerson);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2.6、运行后输出

运行 Main 方法后,person.xml 文件内容如下:

xml 复制代码
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <name>张三</name>
    <age>30</age>
</person>

控制台输出:

复制代码
XML 文件生成成功:person.xml
从 XML 解析的对象:Person{name='张三', age=30}

X、后记

通过本篇文章,我们全面解析了 Spring-OXM 模块的核心功能,并基于 JAXB 提供了完整的示例,帮助大家理解如何在 Spring 应用中高效地进行 XML 处理。

在实际项目中,选择合适的 OXM 方案非常重要:

  • 如果你需要 Java 对象与 XML 之间的转换,spring-oxm 结合 JAXB 是一个不错的选择。
  • 如果你的项目涉及 SQL 交互,那么 MyBatis 更适合数据访问,而无需 spring-oxm。
  • 如果你的需求更加复杂(如 WebService、数据同步),可以结合 JAXB、XStream、Jackson 等技术灵活选择。

希望这篇文章能帮助你掌握 Spring-OXM,并在日常开发中提升你的 XML 处理能力。如果你有更深入的问题或实践经验,欢迎交流探讨! 🚀

相关推荐
小小张说故事18 分钟前
pandas 读大 CSV 太慢?6 个实测提速技巧(dtype / 分块 / 引擎选择)
后端·python·pandas
yi01122 分钟前
DAY17: LeetCode 139|单词拆分:从“把单词删掉”到用 DP 记录合法切口
人工智能·笔记·python·算法·leetcode·动态规划
Java的搬运工26 分钟前
【无标题】
python·机器学习·docker·fastapi·模型部署·mlops·ai工程化
云絮.32 分钟前
Spring MVC(二)
服务器·spring·mvc
Summer-Bright39 分钟前
深度 | 壁仞1.74亿中标智算中心:国产GPU从能用跨进商用,但4.5亿的大单却因凑不齐三家废标了
数据库·ai·国产gpu
云安全助手1 小时前
自建接入VS聚合平台:企业 AI 调用的选型思路与迁移成本拆解
java·大数据·数据库·人工智能·ai大模型
小小张说故事1 小时前
SHAP 可解释性入门:模型为什么这么判?Python 实战 + 4 个最常见的误读
后端·python·机器学习
m0_587383001 小时前
24小时自助健身房软硬件解决方案实战:从架构设计到部署指南
java·spring·小程序·架构·需求分析
白露与泡影1 小时前
Redis 的“单线程”与“多线程”:一场关于性能与简洁的权衡
数据库·redis·php
codists1 小时前
2026年8月文章一览
python