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。

入门栗子

配置清单:

applicationContext.xml Spring配置文件

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.springframework.org/schema/beans
  4. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  5. <bean id="oxmDemo" class="com.mdf.springoxm.oxmDemo">
  6. <property name="marshaller" ref="castorMarshaller" />
  7. <property name="unmarshaller" ref="castorMarshaller" />
  8. </bean>
  9. <!-- 引入castor包:castor-1.3.2-core.jar,castor-1.3.2-xml.jar -->
  10. <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller">
  11. <property name="mappingLocation" value="classpath:mapping.xml" />
  12. </bean>
  13. </beans>

编组和解组时,套用的mapping格式,在进行解组的时候,必须使用mapping才能成功(这里存在疑问,不知道是否因为自己写法问题,只能通过mapping进行格式编码才能进行解组,否则报出无法找到root element的错误)。
mapping.xml文件

  1. <mapping>
  2. <class name="com.mdf.springoxm.Customer">
  3. <map-to xml="Customer"/>
  4. <field name="flag" type="boolean">
  5. <bind-xml name="flag" node="element"/>
  6. </field>
  7. <field name="name" type="string">
  8. <bind-xml name="name" node="element"/>
  9. </field>
  10. <field name="sex" type="string">
  11. <bind-xml name="sex" node="element"/>
  12. </field>
  13. </class>
  14. </mapping>

自定义Bean文件

Customer.java

  1. package com.mdf.springoxm;
  2. public class Customer {
  3. private String name;
  4. private String sex;
  5. private Boolean flag;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public String getSex() {
  13. return sex;
  14. }
  15. public void setSex(String sex) {
  16. this.sex = sex;
  17. }
  18. public Boolean getFlag() {
  19. return flag;
  20. }
  21. public void setFlag(Boolean flag) {
  22. this.flag = flag;
  23. }
  24. }

xmlDemo.java文件

  1. package com.mdf.springoxm;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import javax.xml.transform.stream.StreamResult;
  6. import javax.xml.transform.stream.StreamSource;
  7. import org.springframework.oxm.Marshaller;
  8. import org.springframework.oxm.Unmarshaller;
  9. public class oxmDemo{
  10. private Marshaller marshaller;
  11. private Unmarshaller unmarshaller;
  12. public Marshaller getMarshaller() {
  13. return marshaller;
  14. }
  15. public void setMarshaller(Marshaller marshaller) {
  16. this.marshaller = marshaller;
  17. }
  18. public Unmarshaller getUnmarshaller() {
  19. return unmarshaller;
  20. }
  21. public void setUnmarshaller(Unmarshaller unmarshaller) {
  22. this.unmarshaller = unmarshaller;
  23. }
  24. public void convertFromObjectToXML(Object object, String filepath)
  25. throws IOException {
  26. FileOutputStream os = null;
  27. try {
  28. os = new FileOutputStream(filepath);
  29. getMarshaller().marshal(object, new StreamResult(os));
  30. } finally {
  31. if (os != null) {
  32. os.close();
  33. }
  34. }
  35. }
  36. public Object convertFromXMLToObject(String xmlfile) throws IOException {
  37. FileInputStream is = null;
  38. try {
  39. is = new FileInputStream(xmlfile);
  40. return getUnmarshaller().unmarshal(new StreamSource(is));
  41. } finally {
  42. if (is != null) {
  43. is.close();
  44. }
  45. }
  46. }
  47. }

测试

  1. import org.springframework.context.ApplicationContext;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. import com.mdf.springoxm.Customer;
  4. import com.mdf.springoxm.oxmDemo;
  5. import java.io.IOException;
  6. public class Main {
  7. private static final String XML_FILE_NAME = "customer.xml";
  8. public static void main(String[] args) throws IOException {
  9. ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  10. oxmDemo converter = (oxmDemo) appContext.getBean("oxmDemo");
  11. Customer customer = new Customer();
  12. customer.setName("yiibai");
  13. customer.setFlag(true);
  14. customer.setSex("Haikou haidiandao");
  15. System.out.println("Convert Object to XML!");
  16. //from object to XML file
  17. converter.convertFromObjectToXML(customer, XML_FILE_NAME);
  18. System.out.println("Done \n");
  19. System.out.println("Convert XML back to Object!");
  20. //from XML to object
  21. Customer customer2 = (Customer)converter.convertFromXMLToObject(XML_FILE_NAME);
  22. System.out.println(customer2);
  23. System.out.println("Done");
  24. }
  25. }

测试结果:

  1. 五月 11, 2016 2:27:52 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
  2. 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1221be2: startup date [Wed May 11 14:27:51 CST 2016]; root of context hierarchy
  3. 五月 11, 2016 2:27:52 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. 信息: Loading XML bean definitions from class path resource [applicationContext.xml]
  5. 五月 11, 2016 2:27:52 下午 org.springframework.oxm.castor.CastorMarshaller afterPropertiesSet
  6. 信息: Configured using [class path resource [mapping.xml]]
  7. Convert Object to XML!
  8. Done
  9. Convert XML back to Object!
  10. com.mdf.springoxm.Customer@b419da
  11. Done
 
0

OXM的更多相关文章

  1. spring oxm入门(包含demo)

    O/X Mapper 是什么? Spring 3.0 的一个新特性是 O/X Mapper.O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 XML.它的目的是在 Java 对象(几乎 ...

  2. Spring 4 官方文档学习(十)数据访问之OXM

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/oxm.html Java Object 与 XML ...

  3. Spring oxm入门实例

    O/XMapper是什么? Spring3.0的一个新特性是O/XMapper.O/X映射器这个概念并不新鲜,O代表Object,X代表XML.它的目的是在Java对象(几乎总是一个plainoldJ ...

  4. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  5. SpingMVC 核心技术帮助文档

    声明:本篇文档主要是用于参考帮助文档,没有实例,但几乎包含了SpringMVC 4.2版本的所有核心技术,当前最新版本是4.3,4.2的版本已经经是很新的了,所以非常值得大家一读,对于读完这篇文档感觉 ...

  6. [spring]03_装配Bean

    3.1 JavaBean 3.1.1 JavaBean 是什么 JavaBean 是一种JAVA语言写成的可重用组件. 为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器. Jav ...

  7. spring笔记6 spring IOC的中级知识

    1,spring ioc的整体流程,xml配置 spring ioc初始化的流程结合上图 步骤编号 完成的工作 1 spring容器读取配置文件,解析称注册表 2 根据注册表,找到相应的bean实现类 ...

  8. springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】

    restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式. 描述资源的三 ...

  9. Spring_的jar详细说明

    org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spring 2.5.6的时候需要a ...

随机推荐

  1. 关于一个js连续赋值问题之我见(词略穷,见谅)

    前几天在搜索面试题时发现了这么一段代码,执行完后感觉完全不与所想的一样 var a = { n : 1 }; var b = a; a.x = a = {n : 2}; console.log(a.x ...

  2. Force.com微信开发系列(三)申请测试账号及回复图文消息

    Force.com除了简单的文本消息回复外,还能回复图文并茂的消息.能回复音乐或者视频.能对用户发来的语音进行识别.能够搜集用户的地理位置信息并提供相应的内容或服务等,本文将对这些技能一一展开说明,在 ...

  3. Android7.0 Phone应用源码分析(二) phone来电流程分析

    接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...

  4. OC中NSDictionary和NSSet简单操作

    /** *  字典 存放键值对类型的数据 存放数据是无序的 */ // 字典在控制台输出是用{}包括起来的 // NSDictionary 不可变字典 // 1.创建对象 // 初始化方法 NSDic ...

  5. 提高Objective-C代码质量心机一:简化写法

    提高OC代码质量的小心机 一.OC特性 OC 为 C 语言添加了面向对象特性,是其超集; OC 使用动态绑定的消息结构,也就是,在运行时才会检查对象类型; 接收一条消息后,究竟应执行何种代码,由运行期 ...

  6. Stronger (What Doesn't Kill You)

    今天听一个歌曲,挺不错的.以前一直不知道意思.这次把歌词摘抄下来. 试听音乐: 原版MV: You know the bed feels warmer 你知道被窝里的温暖 Sleeping here ...

  7. Handler与Looper,MessageQueue的关系

    总结一下Handler与Looper,MessageQueue的关系,并实现自定义与子线程相关的Handler. 一.Handler与Looper,MessageQueue的关系 它们之间的关系其实就 ...

  8. 软件测试Lab2

    1.本次上机实验任务:使用webDriver完后自动化测试 2.本次上机实验目的:掌握webDriver的用法和配置. 3.本次上机实验内容: 3.1Selenium的安装: 首先我们上Seleniu ...

  9. JDK自带工具一览表。妈妈再也不用担心你到处去下载小软件了~~

    原来JDK早早就给我准备好了要用到的工具..反编译,JVM性能监视.诊断. JDK(Java Development Kit)是Java程序员最核心的开发工具,没有之一. JDK是一个功能强大的Jav ...

  10. p2p投资理财入门篇(新手必备)

    在互联网金融浪潮下,如果你只知道余额宝.理财通,如果你认为宝宝们就可以代表整个互联网金融,那可真是大错特错.这些年来,P2P这股强大势力一直在互联网金融领域兴风作浪,随着被高层正名.监管升级,P2P的 ...