`
一生漂泊
  • 浏览: 11250 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring OXM使用体验

 
阅读更多

本文转载自http://www.ibm.com/developerworks/cn/xml/x-springXOM/

O/X Mapper 是什么?

Spring 3.0 的一个新特性是 O/X Mapper。O/X 映射器这个概念并不新鲜,O 代表 ObjectX 代表 XML。它的目的是在 Java 对象(几乎总是一个 plain old Java object,或简写为 POJO)和 XML 文档之间来回转换。

例如,您可能有一个带有几个属性的简单 bean,且您的业务需要将那个 Java 对象转换为一个 XML 文档。Spring 的 O/X Mapper 能够为您解决那个问题。如果反过来,您需要将一个 XML 文档转换为一个简单 Java bean,Spring 的 O/X Mapper 也能胜任。

有一点需要注意:Spring O/X Mapper 只是定义由流行的第三方框架实现的统一的界面。要利用 Spring 的 O/X 功能,您需要一个在 Java 对象和 XML 之间来回转换的实用程序。Castor 就是这样一个流行的第三方工具,本文将使用这个工具。其他这样的工具包括 XMLBeans、Java Architecture for XML Binding (JAXB)、JiBX 和 XStream。

编组和解组

进行 O/X 映射时,您经常会看到编组(marshalling)解组(unmarshalling) 这两个术语。

编组 指将 Java bean 转换成 XML 文档的过程,这意味着 Java bean 的所有字段和字段值都将作为 XML 元素或属性填充到 XML 文件中。有时,编组也称为序列化(serializing)

如您所料,解组 是与编组完全相反的过程,即将 XML 文档转换为 Java bean,这意味着 XML 文档的所有元素或属性都作为 Java 字段填充到 Java bean 中。有时,解组也称为反序列化(deserializing)

使用 Spring 的 O/X Mapper 的好处

使用 Spring 的 O/X Mapper 的一个最直接的好处是可以通过利用 Spring 框架的其他特性简化配置。Spring 的 bean 库支持将实例化的 O/X 编组器注入(即前面提到过的 “依赖项注入”)使用那些编组器的对象。重申一遍,这将加快应用程序开发和部署。

遵循坚实的面向对象的设计实践,Spring O/X 框架只定义两个接口:Marshaller 和 Unmarshaller,它们用于执行 O/X 功能,这是使用这个框架的另一个重大好处。这些接口的实现完全对独立开发人员开放,开发人员可以轻松切换它们而无需修改代码。例如,如果您一开始使用 Castor 进行 O/X 转换,但后来发现它缺乏您需要的某个功能,这时您可以切换到 XMLBeans 而无需任何代码更改。唯一需要做的就是更改 Spring 配置文件以使用新的 O/X 框架。

使用 Spring 的 O/X Mapper 的另一个好处是统一的异常层次结构。Spring 框架遵循使用它的数据访问模块建立的模式,方法是将原始异常对象包装到 Spring 自身专为 O/X Mapper 建立的运行时异常中。由于第三方提供商抛出的原始异常被包装到 Spring 运行时异常中,您能够查明出现异常的根本原因。您也不必费心修改代码以捕获异常,因为异常已包装到一个运行时异常中。以下几个运行时异常扩展了基础异常XMLMappingExceptionGenericMarshallingFailureExceptionValidationFailureExceptionMarshallingFailureException 和UnmarshallingFailureException

一个简单的演示

现在您已经了解了 Spring 的 O/X Mapper 的背景和基础知识,可以检验它的使用方法了。在本文中,您首先创建一个简单的 Spring 应用程序,该程序独立于任何 Java Enterprise 依赖项。然后,您创建一个简单的 Java 类,它访问 Spring 的配置文件来实例化该类并注入 O/X 依赖项。参见 下载 部分获取所有源代码文件(包括配置文件)的链接。

编码

首先应该注意 Spring 配置文件。清单 1 是应用程序用于执行编组和解组操作的配置文件。注意,这个文件必须 在运行时位于类路径中。


清单 1. 配置文件

				
<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-3.0.xsd">

    <bean id="oxmExample" class="com.xyz.OXMExample">
        <property name="marshaller" ref="castorMarshaller" />
        <property name="unmarshaller" ref="castorMarshaller" />
    </bean>
    <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller">
    	<property name="mappingLocation" value="classpath:mapping.xml" />
    </bean>
</beans>

 

如您所见,这个配置文件只定义了两个 bean,这是为了简便起见。第一个 bean 是用于执行演示的类:com.xyz.OXMExample。与该类关联的两个属性使用依赖项注入,它们都使用 castorMarshaller bean 的一个实例注入。这是在 Spring 框架中定义 bean 的标准方法,经验丰富的 Spring 开发人员很快就会意识到这一点。

另一个 bean 是 castorMarshaller bean 本身,它是 org.springframework.oxm.castor.CastorMarshaller 的一个实例,org.springframework.oxm.castor.CastorMarshaller 主要用于包装 Castor 框架。如前所述,使用 Spring 的 O/X 功能需要使用一个第三方 O/X 框架。在本例中,这个第三方产品是 Castor。还要注意,有一个属性使用 castorMarshaller 定义,那是用于在 Java bean 和 XML 输出之间来回映射的映射文件。这个文件称为 mapping.xml,它必须 在运行时位于类路径中。我将稍后解释 mapping.xml 文件的内容。

清单 2 实际执行 O/X 映射器的代码的部分清单。如您所见,它是一个简单的 Java 类。


清单 2. OXMExample 类(节选)

				
public class OXMExample {
    private static final String FILE_NAME = "simplebean.xml";
    private SimpleBean simpleBean;

    private Marshaller marshaller;
    private Unmarshaller unmarshaller;

    public void setMarshaller(Marshaller marshaller) {
        this.marshaller = marshaller;
    }

    public void setUnmarshaller(Unmarshaller unmarshaller) {
        this.unmarshaller = unmarshaller;
    }

    public void saveSimpleBean() throws IOException {
        FileOutputStream os = null;
        try {
            os = new FileOutputStream(FILE_NAME);
            this.marshaller.marshal(simpleBean, new StreamResult(os));
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

    public void loadSimpleBean() throws IOException {
        FileInputStream is = null;
        try {
            is = new FileInputStream(FILE_NAME);
            this.simpleBean 
                        = (SimpleBean) this.unmarshaller.unmarshal(new StreamSource(is));
        } finally {
            if (is != null) {
                is.close();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        ApplicationContext appContext 
                        = new ClassPathXmlApplicationContext("applicationContext.xml");
        OXMExample ex = (OXMExample) appContext.getBean("oxmExample");
        ex.go();
    }

    private void go() throws IOException {
        simpleBean = getSimpleBean();

        saveSimpleBean();
        loadSimpleBean();
        
        System.out.println("name: " + simpleBean.getName());
        System.out.println("job description: " + simpleBean.getJobDescription());
        System.out.println("age: " + simpleBean.getAge());
        System.out.println("executive: " + simpleBean.isExecutive());
    }


    private SimpleBean getSimpleBean() {
        SimpleBean simpleBean = new SimpleBean();
        simpleBean.setAge(35);
        simpleBean.setExecutive(false);
        simpleBean.setJobDescription("Janitor");
        simpleBean.setName("Mister Jones");

        return simpleBean;

    }
}

 

要解释 清单 2,必须首先介绍 main 方法,因为该方法将先执行。然后再接着介绍清单 2。

首先,在 main 方法中,您的代码捕获 Spring 应用程序的上下文,就是您在 清单 1 中看到的配置文件。这个文件必须在类路径中,否则运行代码将产生一个异常。

当您获得应用程序上下文时,OXMExample 的一个实例从该配置文件中提供的定义创建。注意,这个 bean 在代码中的名称(oxmExample)与配置文件中定义的名称(见清单 1)一致。创建 OXMExample 的一个实例后,调用 go() 方法。这有点反常,因为 Spring 框架实例化一个已经从命令行运行的对象,但那只是为了实现演示目的而进行的简化。

go() 方法在打印结果数据前完成 3 个任务:

  1. 创建 SimpleBean 的一个实例。
  2. 编组该实例。
  3. 解组从编组创建的 XML 文档。

您使用 getSimpleBean() 方法实例化一个包含一个虚拟员工的信息的 SimpleBean 对象。这个信息包含年龄(一个整数)、工作描述(一个字符串)、姓名(一个字符串)和该员工是否是执行官(一个布尔型)。您使用测试数据和返回调用者的返回对象(在本例中为 go() 方法)填充字段。您在编组发生时将这个 bean 写入一个 XML 文件,在解组发生时读取那个 XML 文件的内容。

saveSimpleBean() 方法执行编组。首先,您获得一个指向 simplebean.xml 的对象,然后,您使用编组器对象(通过 Spring 的依赖项注入实例化)调用 marshal 方法。这个方法需要两个参数:

  • 要被编组的对象(本例中为 SimpleBean 实例)
  • 一个 StreamResult 对象,它基本上表示一个 XML 输出抽象

loadSimpleBean() 方法执行解组。首先,您获取一个指向 simplebean.xml 的 FileInputStream 对象,然后,您使用解组器对象(通过 Spring 的依赖项注入实例化)调用 unmarshal 方法。唯一需要的参数是一个包装 FileInputStream 对象的 StreamSource 对象。注意,解组将创建一个泛型对象,因此您必须将其显式设置为 SimpleBean 类型。

即使这个类和 Spring 配置文件已经就绪,您也还没有准备好运行这段代码。还记得 清单 1 中的映射文件吗?您还需要定义那个映射文件。定义代码如 清单 3 所示,而且,再说一遍,它也必须在运行时位于类路径中。


清单 3. mapping.xml 文件

				
<mapping>
        <class name="com.xyz.SimpleBean">

           <map-to xml="simplebean"/>

           <field name="age" type="integer">
              <bind-xml name="age" node="element"/>
           </field>

           <field name="executive" type="boolean">
              <bind-xml name="is-executive" node="element"/>
           </field>
	   
           <field name="jobDescription" type="string">
              <bind-xml name="job" node="element"/>
           </field>

           <field name="name" type="string">
              <bind-xml name="name" node="element"/>
           </field>
        </class>
</mapping>

 

清单 3 中的映射文件特定于 O/X 映射的 Castor 实现。第一个元素(class)定义要映射到一个 XML 输出的类。您必须指定完整路径。

map-to 元素提供 XML 文件的根元素的名称。这很重要,因为 XML 规范规定,每个 XML 文件必须有一个根元素。

每个 field 元素都将被映射到 SimpleBean 类中的一个特定字段。每个 field 元素的 bind-xml 子元素用于指定关于该字段的特定于 XML 的信息,如对应的 XML 元素的名称,每个字段的值应该是一个元素值还是一个属性值。如您所见,在本例中,所有值都是元素值。

测试

尽管代码已经编写完成,但在执行这个应用程序之前,您必须处理一些依赖项。

特定于 Spring 的依赖项有:

  • org.springframework.asm-3.0.0.M4.jar
  • org.springframework.beans-3.0.0.M4.jar
  • org.springframework.context-3.0.0.M4.jar
  • org.springframework.core-3.0.0.M4.jar
  • org.springframework.expression-3.0.0.M4.jar
  • org.springframework.oxm-3.0.0.M4.jar

特定于 Castor 的依赖项有:

  • castor-1.3-core.jar
  • castor-1.3-xml.jar

您还需要 commons-logging-1.1.1.jar 和 log4j-1.2.15.jar,因为 Spring 框架需要它们。

所有这些 Java Archive (JAR) 文件必须在运行时位于类路径中。如果您在没有这些依赖项的情况下试图运行代码,您很可能会收到一个异常,指出某个类没有找到。如果遇到这种情况,只需双击您的类路径,确保所有的必要依赖项已就绪。事实上,要成功编译这段代码,您需要大部分 JAR 文件。要了解关于获取这些 JAR 文件的信息,请参见本文末尾的 参考资料

您可以使用您钟爱的 IDE 或只是使用命令行来运行 OXMExample.class。要从命令行运行,只需从您的工作目录输入 java -cp [classpath] OXMExample,这里的 [classpath] 是指向刚才提到的所有依赖项(JAR 文件和配置文件)的类路径。

首次运行该程序后,一个名为 simplebean.xml 的新文件将出现在您的工作目录中。该文件的内容应该如 清单 4 所示。


清单 4. simplebean.xml 文件

				
<?xml version="1.0" encoding="UTF-8"?>
<simplebean>
 <age>35</age>
 <is-executive>false</is-executive>
 <job>Janitor</job>
 <name>Mister Jones</name>
</simplebean>

 

清单 4 显示了来自应用程序的编组端的输出,而 清单 5 则显示来自应用程序的解组端的结果,这些结果将在您的控制台中显示。


清单 5. 解组输出

				
name: Mister Jones
job description: Janitor
age: 35
executive: false

 

现在,您已经成功地完成了您的首次 Spring O/X 映射测试。祝贺您!

现在最好做开发人员应该做的工作:修改代码。向类添加字段并将它们映射到 XML 文件。删除一些字段并将它们从 XML 文件中移除。参考 Castor 文档,尝试一些更复杂的工作,比如嵌套元素。您可以随心所欲地尝试各种可能性。

结束语

Spring 的 O/X 映射接口是 Spring 框架的强大特性。借助它,您不仅可以将 XML 文档转换为 Java 对象,还可以将 Java 对象转换为 XML 文档。

它利用 Spring 的一个关键优势:依赖项注入。通过结合使用依赖项注入和 Spring 的 O/X Mapper,您可以轻松开发一个解决方案,该方案可以使用任一 O/X 实现,比如 Castor、XBeans、JiBX、JAXB 和 XStream。由于各个特定实现是 Spring 强大的 Inversion of Control 容器的一部分,开发人员可以在多个特定 O/X 实现之间轻松切换而无需修改代码。

Spring 的 O/X Mapper 还向开发人员提供一个统一的异常层次结构,这意味着不管您使用哪个第三方实现,抛出的运行时异常都是相同的。再强调一次,这将有利于在多个 O/X 供应商之间切换。

在 Java 开发社区中,提供 XML 支持的 Java 应用程序非常热门并且 Spring 框架被广泛使用,因此 Spring 的 O/X Mapper 将受到全世界 Java 应用程序开发人员的欢迎。

分享到:
评论

相关推荐

    spring3 jar包

    Spring3作为Spring框架的一个重要版本,引入了许多增强特性和优化,为开发者提供了更强大的功能和更好的开发体验。下面将详细介绍Spring3框架的核心组件、关键特性以及在jar包中的作用。 1. **核心容器**:这是...

    spring-framework-reference-4.3.26.pdf

    在Spring Framework 4.0中,包括了改进的入门体验、移除已过时的包和方法、支持Java 8以及对Java EE 6和7的优化、Groovy的Bean定义DSL、核心容器改进、通用Web改进、WebSocket、SockJS和STOMP消息传递的改进、以及...

    spring-framework-4.1.6.RELEASE

    在数据访问层,Spring支持JDBC、ORM(如Hibernate、JPA)和OXM(Object-XML Mapping)等。4.1.6版本对这些技术的整合进行了优化,提升了事务管理的效率,同时提供了对JDBC 4.1和JPA 2.1规范的支持。 4. **Web层**...

    官方原版源码 spring-5.2.8.RELEASE.zip

    5.2.8.RELEASE是Spring框架的一个稳定版本,提供了诸多改进和新特性,旨在提升性能、增强安全性和改善开发者体验。本文将对这个版本的源码进行深入剖析,帮助读者更好地理解和利用Spring框架。 首先,源码分析通常...

    Spring开发工具包

    Spring的开发工具包则为开发者提供了增强的开发体验,使得Spring应用程序的构建、测试和调试变得更加高效。 Spring的核心特性之一是依赖注入(Dependency Injection,DI),它允许组件之间的关系在运行时动态地配置...

    spring-framework-reference

    通过阅读文档,开发者可以学习到如何使用Spring框架构建企业级应用,掌握Spring的核心概念如IoC容器和依赖注入,并了解Spring提供的各种模块和服务。无论你是初次接触Spring的新手,还是需要深入了解框架的高级...

    spring文档4.3.x版本

    - 在Spring Framework 4.0中,改进了入门体验,移除了已废弃的包和方法,支持了Java 8(同时兼容Java 6和7),同时也支持了Java EE 6和7。 - 引入了Groovy Bean定义DSL(领域特定语言),进一步增强了核心容器。 - ...

    Spring Framework Reference Documentation 4.25

    - **简介**:这部分内容为开发者提供了快速入门指南,帮助新用户理解如何开始使用Spring框架进行开发。 - **目标读者**:面向希望了解如何快速搭建Spring应用环境的初学者。 ##### 2. Spring框架介绍 - **依赖注入...

    Spring3中文帮助文档

    3. MVC(Model-View-Controller)框架:Spring MVC是Spring提供的Web应用开发框架,它支持RESTful风格的URL映射、视图解析、数据绑定、验证以及国际化等功能,提供了高效且灵活的Web应用开发体验。 4. 事务管理:...

    Spring 3.0 API

    Spring 3.0 API是Spring框架的一个重要版本,其设计宗旨在于提供更为强大和高效的开发体验。在Spring 3.2.1 API的文档中,对Spring框架的特性进行了全面的说明和讲解,涵盖了依赖注入、面向切面编程、测试等多方面...

    简单Spring 实例(自己写的)

    2. **数据访问/集成**:Spring 提供了对各种数据库的支持,包括 JDBC、ORM(Hibernate、JPA)和 OXM(Object/XML Mapping)。 3. **Web 模块**:Spring MVC 是一个用于构建 Web 应用的全功能 MVC 框架,它简化了...

    spring-framework-5.3.15.tar.gz

    2. Data Access/Integration(数据访问/集成):包括JDBC、ORM、OXM、Tx(事务管理)等,提供了对多种数据库访问的支持。新版本中,对事务管理进行了增强,支持更多的事务策略。 3. Web:Web-Servlet、Web-Portlet...

    spring-framework-5.1.x.zip

    Spring Framework作为Java领域最广泛应用的轻量级框架之一,其5.1.x版本的发布带来了许多改进和新特性,为开发者提供了更高效、更灵活的开发体验。本篇文章将详细探讨Spring Framework 5.1.x的核心概念、关键组件...

    spring官方文档

    - Spring 4.x引入了Groovy Bean Definition DSL,这是一种使用Groovy语言来定义Spring配置文件的方式,更加灵活且易于阅读。 **3.6 核心容器改进** - Spring 4.x对核心容器进行了改进,提高了性能并增强了灵活性。...

    spring-framework-4.3.7.RELEASE-docs

    它是开发人员理解和使用Spring框架的重要参考资料。通过阅读API文档,开发者可以了解各个类的功能、方法的参数和返回值,以及可能抛出的异常。这对于理解和集成Spring的组件至关重要,特别是在实现自定义配置、扩展...

    Spring4.3.8官方jar包(包含文档) 下载

    Spring 4.3.8是该框架的一个稳定版本,发布于2017年,它带来了许多改进和修复,提升了性能和开发者的体验。在本篇文章中,我们将深入探讨Spring 4.3.8的主要特性以及它与SpringMVC的关系。 1. **核心容器**:Spring...

    Spring Framework Reference Documentation 4.0

    为了改善用户体验,Spring 4.0在多个方面进行了改进。首先,它引入了对Java 8的支持,并兼容Java 6和Java 7版本。它还包括对Java EE 6和Java EE 7的全面支持,并提供了Groovy语言的Bean定义DSL,使得使用Groovy来...

    spring-framework-5.2.8.RELEASE.zip

    5.2.8.RELEASE版本是Spring发展的一个里程碑,它在性能优化、新功能引入以及开发者体验上都有显著提升。本文将深入探讨这个版本中的关键知识点。 一、Spring框架概述 Spring框架是一个开源的Java平台,它简化了企业...

    Spring框架原理,Spring的demo示意源码,供大家学习参考

    6. **Spring Boot**:Spring Boot是近年来非常流行的快速开发框架,它简化了Spring应用的初始搭建以及配置过程,提供了一种“开箱即用”的体验。 7. **Spring Batch**:Spring Batch是Spring框架的一部分,专门用于...

Global site tag (gtag.js) - Google Analytics