spring oxm入门(包含demo)

O/X Mapper 是什么?

Spring 3.0 的一个新特性是 O/X Mapper。O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 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 运行时异常中,您能够查明出现异常的根本原因。您也不必费心修改代码以捕获异常,因为异常已包装到一个运行时异常中。以下几个运行时异常扩展了基础异常  XMLMappingException:GenericMarshallingFailureException、 ValidationFailureException、MarshallingFailureException 和 UnmarshallingFailureException。

一个简单的演示

现 在您已经了解了 Spring 的 O/X Mapper 的背景和基础知识,可以检验它的使用方法了。在本文中,您首先创建一个简单的 Spring 应用程序,该程序独立于任何 Java Enterprise 依赖项。然后,您创建一个简单的 Java 类,它访问 Spring 的配置文件来实例化该类并注入 O/X 依赖项。

编码

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

清单 1. 配置文件

?


1

2

3

4

5

6

7

8

9

10

11

12

13

<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 类(节选)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

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 文件

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<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 文件

?


1

2

3

4

5

6

7

<?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 应用程序开发人员的欢迎。

时间: 2024-10-18 17:36:44

spring oxm入门(包含demo)的相关文章

spring security入门教程 demo注解

http://www.mossle.com/docs/springsecurity3/html/ns-config.html#ns-minimal 这是3.0的中文文档,写的比较详细,还有<spring in action>最新版也有一章专门是讲这个的.在学习的过程下载了spring security的github上面的demo,其中tutorial-xml是最简单的demo了.在源码里我把里面的一些重要的地方都详细注解了,做个备忘. ps:demo的logout似乎不能用,有bug. 链接:

Spring Boot入门 and Spring Boot与ActiveMQ整合

1.Spring Boot入门 1.1什么是Spring Boot Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的轻量级代替品.无需开发重量级的 Enterprise JavaBean(EJB),Spring 为企业级Java 开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java 对象(Plain Old Java Object,POJO)实现了 EJB 的功能. 虽然 Spring 的组件代码是轻量级的

spring MVC入门示例(hello world demo)

1. Spring MVC介绍 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框 架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的. Spring Web MVC也是服务到工作者模式的实现,但进行可优化.前端控制器是DispatcherServlet:应用控制器其实拆为处理器映射器(Handler M

spring mvc开发入门实例demo源代码下载,很适合新手入门学习用。

原文:spring mvc开发入门实例demo源代码下载,很适合新手入门学习用. 源代码下载:http://www.zuidaima.com/share/1550463469046784.htm Eclipse + Maven + Spring MVC - Simple Example 源代码框架截图:

spring mvc+ibatis+mysql的组合框架入门实例demo源码下载

原文:spring mvc+ibatis+mysql的组合框架入门实例demo源码下载 源代码下载地址:http://www.zuidaima.com/share/1550463678958592.htm spring mvc+ibatis+mysql的组合框架实例 首页 http://localhost:端口/项目/index.jsp 添加用户 添加地址 项目截图 jar包截图

Spring MVC 入门 - 框架搭建

感觉网上从环境搭建讲起的教程不多,好多示例也比较复杂,而且也没个图啥的,所以就上一个简单易懂的版本. 有多简单捏?从eclipse建立工程开始,结束后作出一个可以响应请求的Servlet. 在这个文章里面,我们需要 - 建立一个eclipse工程: 编写两个xml: 编写两个jsp页面: 编写一个Java文件. 准备工作 - Eclipse J2EE版本: Tomcat 一只: 注:所有斜体字代表-文件名,类名,变量名等可替换内容. 第一步: 使用Eclipse建立动态网页工程. 输入项目名字,

《深入实践Spring Boot》第1章 Spring Boot入门

目录 第1章 Spring Boot入门 1.1 配置开发环境 1.1.1 安装JDK 1.1.2 安装InterlliJ IDEA 1.1.3 安装Apache Maven 1.1.4 安装Git客户端 1.2 创建项目工程 1.2.1 使用Maven新建项目 1.2.2 使用Spring Initializr新建项目 1.3 使用Spring Boot 1.3.1 Maven依赖管理 1.3.2 一个简单的实例 1.4 运行与发布 1.4.1 在IDEA环境中运行 1.4.2 将应用打包发布

Spring Cloud 入门教程(五): Ribbon实现客户端的负载均衡

接上节,假如我们的Hello world服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端口8762修改为8763.然后启动这两个Spring Boot应用, 就可以得到两个Hello World服务.这两个Hello world都注册到了eureka服务中心.这时候再访问http://localhost:8761, 可以看到两个hello world服务已经注册.(服务与注册参见Spr

Spring快速入门

时间:2017-1-29 02:15 Spring的IOCSpring的AOP,AspectJSpring的事务管理,三大框架的整合 --什么是Spring 1.Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架.    1)分层:        *   SUN公司提供的EE的三层结构:Web层.业务层.数据访问层(持久层)        *   Struts2是Web层基于MVC设计模式框架.        *   Hibernate是持久层的一个ORM框架.