什么是OXM?

OXM是Object-to-XML-Mapping的缩写,它是一个O/M-mapper,将java对象映射成XML数据,或者将XML数据映射成java对象。它类似 XML-Marshalling 或者是 XML-Serialization,并不是什么新技术。目前Spring framework 3.0引入了该特性。

现在让我们看看Spring的承诺:

  • 易于配置
  • 一致的接口
  • 一致的异常层次结构

听起来很不错,因为没有喜欢杂乱的接口,繁琐的配置,现在就让我们来检验一下Spring OXM的设计思想,本文着重讲述OXM特性的使用方法。

OXM in Spring 3.0

我们以一个Maven2实例工程来进行说明。首先,创建一个pom.xml文件:

Xml代码  
  1. <project>
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.unitedcoders.examples</groupId>
  4. <artifactId>SpringOxmExample</artifactId>
  5. <packaging>jar</packaging>
  6. <version>1.0.0-SNAPSHOT</version>
  7. <name>SpringOxmExample</name>
  8. <url>http://united-coders.com</url>
  9. <build>
  10. <finalName>SpringOxmExample</finalName>
  11. <plugins>
  12. <!-- Compiler Plugin to compile on Java 1.6 -->
  13. <plugin>
  14. <groupId>org.apache.maven.plugins</groupId>
  15. <artifactId>maven-compiler-plugin</artifactId>
  16. <configuration>
  17. <compilerVersion>1.6</compilerVersion>
  18. <fork>true</fork>
  19. <source>1.6</source>
  20. <target>1.6</target>
  21. </configuration>
  22. </plugin>
  23. </plugins>
  24. </build>
  25. <!-- Properties -->
  26. <properties>
  27. <spring-version>3.0.0.RELEASE</spring-version>
  28. </properties>
  29. <!-- Dependencies -->
  30. <dependencies>
  31. <!-- Spring framework -->
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-core</artifactId>
  35. <version>${spring-version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-beans</artifactId>
  40. <version>${spring-version}</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework</groupId>
  44. <artifactId>spring-oxm</artifactId>
  45. <version>${spring-version}</version>
  46. </dependency>
  47. <!-- Castor Xml -->
  48. <dependency>
  49. <groupId>org.codehaus.castor</groupId>
  50. <artifactId>castor</artifactId>
  51. <version>1.2</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>xerces</groupId>
  55. <artifactId>xercesImpl</artifactId>
  56. <version>2.9.1</version>
  57. </dependency>
  58. <!-- Logging -->
  59. <dependency>
  60. <groupId>commons-logging</groupId>
  61. <artifactId>commons-logging</artifactId>
  62. <version>1.1.1</version>
  63. </dependency>
  64. <!-- Test dependencies -->
  65. <dependency>
  66. <groupId>junit</groupId>
  67. <artifactId>junit</artifactId>
  68. <version>4.4</version>
  69. <scope>test</scope>
  70. </dependency>
  71. </dependencies>
  72. </project>
Xml代码  
  1. <project>
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.unitedcoders.examples</groupId>
  4. <artifactId>SpringOxmExample</artifactId>
  5. <packaging>jar</packaging>
  6. <version>1.0.0-SNAPSHOT</version>
  7. <name>SpringOxmExample</name>
  8. <url>http://united-coders.com</url>
  9. <build>
  10. <finalName>SpringOxmExample</finalName>
  11. <plugins>
  12. <!-- Compiler Plugin to compile on Java 1.6 -->
  13. <plugin>
  14. <groupId>org.apache.maven.plugins</groupId>
  15. <artifactId>maven-compiler-plugin</artifactId>
  16. <configuration>
  17. <compilerVersion>1.6</compilerVersion>
  18. <fork>true</fork>
  19. <source>1.6</source>
  20. <target>1.6</target>
  21. </configuration>
  22. </plugin>
  23. </plugins>
  24. </build>
  25. <!-- Properties -->
  26. <properties>
  27. <spring-version>3.0.0.RELEASE</spring-version>
  28. </properties>
  29. <!-- Dependencies -->
  30. <dependencies>
  31. <!-- Spring framework -->
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-core</artifactId>
  35. <version>${spring-version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-beans</artifactId>
  40. <version>${spring-version}</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework</groupId>
  44. <artifactId>spring-oxm</artifactId>
  45. <version>${spring-version}</version>
  46. </dependency>
  47. <!-- Castor Xml -->
  48. <dependency>
  49. <groupId>org.codehaus.castor</groupId>
  50. <artifactId>castor</artifactId>
  51. <version>1.2</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>xerces</groupId>
  55. <artifactId>xercesImpl</artifactId>
  56. <version>2.9.1</version>
  57. </dependency>
  58. <!-- Logging -->
  59. <dependency>
  60. <groupId>commons-logging</groupId>
  61. <artifactId>commons-logging</artifactId>
  62. <version>1.1.1</version>
  63. </dependency>
  64. <!-- Test dependencies -->
  65. <dependency>
  66. <groupId>junit</groupId>
  67. <artifactId>junit</artifactId>
  68. <version>4.4</version>
  69. <scope>test</scope>
  70. </dependency>
  71. </dependencies>
  72. </project>

该实例中我用到了三个spring 模块,spring-core,spring-beans以及spring-oxm。另外,我使用Castor工程和Apache Xerces作为XML-Marshalling-dependencies.

接着,创建一个简单的javabean,将被序列换成XML字符串:

Java代码  
  1. package com.unitedcoders.examples.spring.oxm.beans;
  2. public class Person {
  3. private String firstname;
  4. private String lastname;
  5. private boolean developer;
  6. public String getFirstname() {
  7. return firstname;
  8. }
  9. public void setFirstname(String firstname) {
  10. this.firstname = firstname;
  11. }
  12. public String getLastname() {
  13. return lastname;
  14. }
  15. public void setLastname(String lastname) {
  16. this.lastname = lastname;
  17. }
  18. public boolean isDeveloper() {
  19. return developer;
  20. }
  21. public void setDeveloper(boolean developer) {
  22. this.developer = developer;
  23. }
  24. }
Java代码  
  1. package com.unitedcoders.examples.spring.oxm.beans;
  2. public class Person {
  3. private String firstname;
  4. private String lastname;
  5. private boolean developer;
  6. public String getFirstname() {
  7. return firstname;
  8. }
  9. public void setFirstname(String firstname) {
  10. this.firstname = firstname;
  11. }
  12. public String getLastname() {
  13. return lastname;
  14. }
  15. public void setLastname(String lastname) {
  16. this.lastname = lastname;
  17. }
  18. public boolean isDeveloper() {
  19. return developer;
  20. }
  21. public void setDeveloper(boolean developer) {
  22. this.developer = developer;
  23. }
  24. }

然后,为O/X-Mapper创建一个接口:

Java代码  
  1. package com.unitedcoders.examples.spring.oxm.mapper;
  2. import java.io.IOException;
  3. public interface OxMapper {
  4. /**
  5. * Serializes assigned Object into a file with the assigned name.
  6. *
  7. * @param object
  8. *            - Object that should be serialized
  9. * @param filename
  10. *            - name of the XML-file
  11. * @throws IOException
  12. */
  13. public abstract void writeObjectToXml(Object object, String filename) throws IOException;
  14. /**
  15. * Deserializes an object from the assigned file.
  16. *
  17. * @param filename
  18. *            - name of the file that should be deserialized
  19. * @return deserialized object
  20. * @throws IOException
  21. */
  22. public abstract Object readObjectFromXml(String filename) throws IOException;
  23. }
Java代码  
  1. package com.unitedcoders.examples.spring.oxm.mapper;
  2. import java.io.IOException;
  3. public interface OxMapper {
  4. /**
  5. * Serializes assigned Object into a file with the assigned name.
  6. *
  7. * @param object
  8. *            - Object that should be serialized
  9. * @param filename
  10. *            - name of the XML-file
  11. * @throws IOException
  12. */
  13. public abstract void writeObjectToXml(Object object, String filename) throws IOException;
  14. /**
  15. * Deserializes an object from the assigned file.
  16. *
  17. * @param filename
  18. *            - name of the file that should be deserialized
  19. * @return deserialized object
  20. * @throws IOException
  21. */
  22. public abstract Object readObjectFromXml(String filename) throws IOException;
  23. }

我定义了两个方法,一个将对象转化成xml文件,一个将xml文件转换成对象。以下是该接口的实现类:

Java代码  
  1. package com.unitedcoders.examples.spring.oxm.mapper;
  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.apache.commons.logging.Log;
  8. import org.apache.commons.logging.LogFactory;
  9. import org.springframework.oxm.Marshaller;
  10. import org.springframework.oxm.Unmarshaller;
  11. import org.springframework.oxm.XmlMappingException;
  12. public class OxMapperImpl implements OxMapper {
  13. private static final Log LOG = LogFactory.getLog(OxMapperImpl.class);
  14. private Marshaller marshaller;
  15. private Unmarshaller unmarshaller;
  16. public void writeObjectToXml(Object object, String filename) throws IOException {
  17. FileOutputStream fos = null;
  18. try {
  19. fos = new FileOutputStream(filename);
  20. marshaller.marshal(object, new StreamResult(fos));
  21. } catch (XmlMappingException e) {
  22. LOG.error("Xml-Serialization failed due to an XmlMappingException.", e);
  23. } catch (IOException e) {
  24. LOG.error("Xml-Serialization failed due to an IOException.", e);
  25. } finally {
  26. if (fos != null) {
  27. fos.close();
  28. }
  29. }
  30. }
  31. public Object readObjectFromXml(String filename) throws IOException {
  32. FileInputStream fis = null;
  33. try {
  34. fis = new FileInputStream(filename);
  35. return unmarshaller.unmarshal(new StreamSource(fis));
  36. } catch (IOException e) {
  37. LOG.error("Xml-Deserialization failed due to an IOException.", e);
  38. } finally {
  39. if (fis != null) {
  40. fis.close();
  41. }
  42. }
  43. return null;
  44. }
  45. public Marshaller getMarshaller() {
  46. return marshaller;
  47. }
  48. public void setMarshaller(Marshaller marshaller) {
  49. this.marshaller = marshaller;
  50. }
  51. public Unmarshaller getUnmarshaller() {
  52. return unmarshaller;
  53. }
  54. public void setUnmarshaller(Unmarshaller unmarshaller) {
  55. this.unmarshaller = unmarshaller;
  56. }
  57. }
Java代码  
  1. package com.unitedcoders.examples.spring.oxm.mapper;
  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.apache.commons.logging.Log;
  8. import org.apache.commons.logging.LogFactory;
  9. import org.springframework.oxm.Marshaller;
  10. import org.springframework.oxm.Unmarshaller;
  11. import org.springframework.oxm.XmlMappingException;
  12. public class OxMapperImpl implements OxMapper {
  13. private static final Log LOG = LogFactory.getLog(OxMapperImpl.class);
  14. private Marshaller marshaller;
  15. private Unmarshaller unmarshaller;
  16. public void writeObjectToXml(Object object, String filename) throws IOException {
  17. FileOutputStream fos = null;
  18. try {
  19. fos = new FileOutputStream(filename);
  20. marshaller.marshal(object, new StreamResult(fos));
  21. } catch (XmlMappingException e) {
  22. LOG.error("Xml-Serialization failed due to an XmlMappingException.", e);
  23. } catch (IOException e) {
  24. LOG.error("Xml-Serialization failed due to an IOException.", e);
  25. } finally {
  26. if (fos != null) {
  27. fos.close();
  28. }
  29. }
  30. }
  31. public Object readObjectFromXml(String filename) throws IOException {
  32. FileInputStream fis = null;
  33. try {
  34. fis = new FileInputStream(filename);
  35. return unmarshaller.unmarshal(new StreamSource(fis));
  36. } catch (IOException e) {
  37. LOG.error("Xml-Deserialization failed due to an IOException.", e);
  38. } finally {
  39. if (fis != null) {
  40. fis.close();
  41. }
  42. }
  43. return null;
  44. }
  45. public Marshaller getMarshaller() {
  46. return marshaller;
  47. }
  48. public void setMarshaller(Marshaller marshaller) {
  49. this.marshaller = marshaller;
  50. }
  51. public Unmarshaller getUnmarshaller() {
  52. return unmarshaller;
  53. }
  54. public void setUnmarshaller(Unmarshaller unmarshaller) {
  55. this.unmarshaller = unmarshaller;
  56. }
  57. }

Spring 3.0 OXM - Spring 3.0 框架新特性相关推荐

  1. Swift 2.0初探:值得注意的新特性

    转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...

  2. MySQL 8.0 在关系数据库方面有这些新特性

    作者 | 捏造的信仰 原文 | https://segmentfault.com/a/1190000013803247 本文介绍几个 8.0 在关系数据库方面的主要新特性. 你可能已经知道 MySQL ...

  3. accept 返回0_从0开始理解Vite的主要新特性(一)

    此文已同步到公众号[因卓诶]以及因卓诶博客: 从0开始理解Vite的主要新特性(一) - 因卓诶-爱分享爱原创的技术博客 ~ 个人博客​www.yinzhuoei.com vite这个工具确实尤大在微 ...

  4. Kafka 2.8.0 正式发布,增加了哪些新特性?

    导读:目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐.可持久化.可水平扩展.支持流数据处理等多种特性而被广泛使用.目前越来越多的开源分布式处理系统如 Cloudera.Storm.Sp ...

  5. Spring Framework 5.2 正式发布,14项新特性一览

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | xplanet 来源 | http://oschina.net/news/1103 ...

  6. CentOS 7.6 MySQL 8.0 RPM包方式安装及新特性介绍

    一.MySQL 8.0新特性: 1.默认字符集由latin1变为utf8mb4 2.MyISAM系统表全部换成InnoDB表 3.自增主键AUTO_INCREMENT的值支持持久化 4.InnoDB表 ...

  7. 重磅!阿里云MongoDB 5.0发布,速来围观新特性

    简介:2021年9月29日下午,阿里云数据库与MongoDB共同发布了阿里云MongoDB 5.0.MongoDB于2021年7月中发布最新5.0版本,阿里云MongoDB率先跟进官方最新版本能力,快 ...

  8. php7.0 yield,PHP7中生成器的新特性 yield-from amp;amp; return-values

    生成器委托 简单地翻译官方文档的描述: PHP7中,通过生成器委托(yield from),可以将其他生成器.可迭代的对象.数组委托给外层生成器.外层的生成器会先顺序 yield 委托出来的值,然后继 ...

  9. C#8.0的两个有趣的新特性以及gRPC

    最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西.今天有空,稍微写一点. 下文中: 关于C#语法特性的部分需要Visual Studio 2019支持. 关于.NET Core的部分需要安装. ...

  10. c# 路径下的最近文件夹_C#8.0的两个有趣的新特性以及gRPC

    最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西.今天有空,稍微写一点. 下文中: 关于C#语法特性的部分需要Visual Studio 2019支持. 关于.NET Core的部分需要安装. ...

最新文章

  1. 结构主题模型(一)stm包工作流
  2. 86句管理名言:管理=勤奋+智慧+知识+心理学
  3. js获取字符串的字节数
  4. 一文简单理解Java反射及使用
  5. git rebase之前需要 commit 才行
  6. php万能表单制作教程,万能表单系统
  7. 自费访学|计算机专业老师赴加拿大卡尔加里大学
  8. mysql 指数 类型_利用MYSQL挑选指数基金
  9. 视频分割软件有什么,怎么分割视频
  10. 回归预测 | MATLAB实现Robust-ELM鲁棒极限学习机多输入单输出
  11. PMBOK项目管理知识体系指南—PMP项目管理学习笔记。
  12. 首届“中新人工智能高峰论坛”即将召开,周志华、李德毅......与你一起对话未来!...
  13. 服务器之间的无线通讯,无线通讯技术之间的比较 - 常见无线通信(数据)传输技术 你知道哪些...
  14. java Date与 double 互转
  15. 【java毕业设计】基于java+BS的QQ屏幕截图工具设计与实现(毕业论文+程序源码)——屏幕截图工具
  16. 奥的斯电梯服务器自动呼梯,奥的斯MCS系统电梯轿厢内呼梯保密设置
  17. 安徽大学2021计算机考研专业课题型,安徽大学电子信息工程学院2021研究生入学考试科目调整通知...
  18. Java,配置Java环境
  19. 蚂蚁金服Java岗社招面试5面历程
  20. ED2K的资源链接如何进行下载?

热门文章

  1. 百度网盘在线播放倍数加速方法
  2. Java天花板从安装JDK配置环境变量开始
  3. 远程桌面连接发生身份验证错误
  4. 引用 陈安之---人生格言
  5. 【大数据】政务大数据体系建设内容
  6. 2021年元旦感悟(和小麓兄弟聊了近90分钟语音后感悟)
  7. 微信小程序跳转京东小程序优惠券领取界面
  8. linux下exit()与_exit()的区别
  9. celtx保存在html,Celtx
  10. 网易薄荷停服:他日山高水长,江湖再见