Spring 3.0 OXM - Spring 3.0 框架新特性
什么是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文件:
- <project>
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.unitedcoders.examples</groupId>
- <artifactId>SpringOxmExample</artifactId>
- <packaging>jar</packaging>
- <version>1.0.0-SNAPSHOT</version>
- <name>SpringOxmExample</name>
- <url>http://united-coders.com</url>
- <build>
- <finalName>SpringOxmExample</finalName>
- <plugins>
- <!-- Compiler Plugin to compile on Java 1.6 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <compilerVersion>1.6</compilerVersion>
- <fork>true</fork>
- <source>1.6</source>
- <target>1.6</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <!-- Properties -->
- <properties>
- <spring-version>3.0.0.RELEASE</spring-version>
- </properties>
- <!-- Dependencies -->
- <dependencies>
- <!-- Spring framework -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-oxm</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <!-- Castor Xml -->
- <dependency>
- <groupId>org.codehaus.castor</groupId>
- <artifactId>castor</artifactId>
- <version>1.2</version>
- </dependency>
- <dependency>
- <groupId>xerces</groupId>
- <artifactId>xercesImpl</artifactId>
- <version>2.9.1</version>
- </dependency>
- <!-- Logging -->
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1.1</version>
- </dependency>
- <!-- Test dependencies -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.4</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </project>
- <project>
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.unitedcoders.examples</groupId>
- <artifactId>SpringOxmExample</artifactId>
- <packaging>jar</packaging>
- <version>1.0.0-SNAPSHOT</version>
- <name>SpringOxmExample</name>
- <url>http://united-coders.com</url>
- <build>
- <finalName>SpringOxmExample</finalName>
- <plugins>
- <!-- Compiler Plugin to compile on Java 1.6 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <compilerVersion>1.6</compilerVersion>
- <fork>true</fork>
- <source>1.6</source>
- <target>1.6</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <!-- Properties -->
- <properties>
- <spring-version>3.0.0.RELEASE</spring-version>
- </properties>
- <!-- Dependencies -->
- <dependencies>
- <!-- Spring framework -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-oxm</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <!-- Castor Xml -->
- <dependency>
- <groupId>org.codehaus.castor</groupId>
- <artifactId>castor</artifactId>
- <version>1.2</version>
- </dependency>
- <dependency>
- <groupId>xerces</groupId>
- <artifactId>xercesImpl</artifactId>
- <version>2.9.1</version>
- </dependency>
- <!-- Logging -->
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1.1</version>
- </dependency>
- <!-- Test dependencies -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.4</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </project>
该实例中我用到了三个spring 模块,spring-core,spring-beans以及spring-oxm。另外,我使用Castor工程和Apache Xerces作为XML-Marshalling-dependencies.
接着,创建一个简单的javabean,将被序列换成XML字符串:
- package com.unitedcoders.examples.spring.oxm.beans;
- public class Person {
- private String firstname;
- private String lastname;
- private boolean developer;
- public String getFirstname() {
- return firstname;
- }
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
- public String getLastname() {
- return lastname;
- }
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
- public boolean isDeveloper() {
- return developer;
- }
- public void setDeveloper(boolean developer) {
- this.developer = developer;
- }
- }
- package com.unitedcoders.examples.spring.oxm.beans;
- public class Person {
- private String firstname;
- private String lastname;
- private boolean developer;
- public String getFirstname() {
- return firstname;
- }
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
- public String getLastname() {
- return lastname;
- }
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
- public boolean isDeveloper() {
- return developer;
- }
- public void setDeveloper(boolean developer) {
- this.developer = developer;
- }
- }
然后,为O/X-Mapper创建一个接口:
- package com.unitedcoders.examples.spring.oxm.mapper;
- import java.io.IOException;
- public interface OxMapper {
- /**
- * Serializes assigned Object into a file with the assigned name.
- *
- * @param object
- * - Object that should be serialized
- * @param filename
- * - name of the XML-file
- * @throws IOException
- */
- public abstract void writeObjectToXml(Object object, String filename) throws IOException;
- /**
- * Deserializes an object from the assigned file.
- *
- * @param filename
- * - name of the file that should be deserialized
- * @return deserialized object
- * @throws IOException
- */
- public abstract Object readObjectFromXml(String filename) throws IOException;
- }
- package com.unitedcoders.examples.spring.oxm.mapper;
- import java.io.IOException;
- public interface OxMapper {
- /**
- * Serializes assigned Object into a file with the assigned name.
- *
- * @param object
- * - Object that should be serialized
- * @param filename
- * - name of the XML-file
- * @throws IOException
- */
- public abstract void writeObjectToXml(Object object, String filename) throws IOException;
- /**
- * Deserializes an object from the assigned file.
- *
- * @param filename
- * - name of the file that should be deserialized
- * @return deserialized object
- * @throws IOException
- */
- public abstract Object readObjectFromXml(String filename) throws IOException;
- }
我定义了两个方法,一个将对象转化成xml文件,一个将xml文件转换成对象。以下是该接口的实现类:
- package com.unitedcoders.examples.spring.oxm.mapper;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import javax.xml.transform.stream.StreamResult;
- import javax.xml.transform.stream.StreamSource;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.springframework.oxm.Marshaller;
- import org.springframework.oxm.Unmarshaller;
- import org.springframework.oxm.XmlMappingException;
- public class OxMapperImpl implements OxMapper {
- private static final Log LOG = LogFactory.getLog(OxMapperImpl.class);
- private Marshaller marshaller;
- private Unmarshaller unmarshaller;
- public void writeObjectToXml(Object object, String filename) throws IOException {
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(filename);
- marshaller.marshal(object, new StreamResult(fos));
- } catch (XmlMappingException e) {
- LOG.error("Xml-Serialization failed due to an XmlMappingException.", e);
- } catch (IOException e) {
- LOG.error("Xml-Serialization failed due to an IOException.", e);
- } finally {
- if (fos != null) {
- fos.close();
- }
- }
- }
- public Object readObjectFromXml(String filename) throws IOException {
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(filename);
- return unmarshaller.unmarshal(new StreamSource(fis));
- } catch (IOException e) {
- LOG.error("Xml-Deserialization failed due to an IOException.", e);
- } finally {
- if (fis != null) {
- fis.close();
- }
- }
- return null;
- }
- public Marshaller getMarshaller() {
- return marshaller;
- }
- public void setMarshaller(Marshaller marshaller) {
- this.marshaller = marshaller;
- }
- public Unmarshaller getUnmarshaller() {
- return unmarshaller;
- }
- public void setUnmarshaller(Unmarshaller unmarshaller) {
- this.unmarshaller = unmarshaller;
- }
- }
- package com.unitedcoders.examples.spring.oxm.mapper;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import javax.xml.transform.stream.StreamResult;
- import javax.xml.transform.stream.StreamSource;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.springframework.oxm.Marshaller;
- import org.springframework.oxm.Unmarshaller;
- import org.springframework.oxm.XmlMappingException;
- public class OxMapperImpl implements OxMapper {
- private static final Log LOG = LogFactory.getLog(OxMapperImpl.class);
- private Marshaller marshaller;
- private Unmarshaller unmarshaller;
- public void writeObjectToXml(Object object, String filename) throws IOException {
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(filename);
- marshaller.marshal(object, new StreamResult(fos));
- } catch (XmlMappingException e) {
- LOG.error("Xml-Serialization failed due to an XmlMappingException.", e);
- } catch (IOException e) {
- LOG.error("Xml-Serialization failed due to an IOException.", e);
- } finally {
- if (fos != null) {
- fos.close();
- }
- }
- }
- public Object readObjectFromXml(String filename) throws IOException {
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(filename);
- return unmarshaller.unmarshal(new StreamSource(fis));
- } catch (IOException e) {
- LOG.error("Xml-Deserialization failed due to an IOException.", e);
- } finally {
- if (fis != null) {
- fis.close();
- }
- }
- return null;
- }
- public Marshaller getMarshaller() {
- return marshaller;
- }
- public void setMarshaller(Marshaller marshaller) {
- this.marshaller = marshaller;
- }
- public Unmarshaller getUnmarshaller() {
- return unmarshaller;
- }
- public void setUnmarshaller(Unmarshaller unmarshaller) {
- this.unmarshaller = unmarshaller;
- }
- }
Spring 3.0 OXM - Spring 3.0 框架新特性相关推荐
- Swift 2.0初探:值得注意的新特性
转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...
- MySQL 8.0 在关系数据库方面有这些新特性
作者 | 捏造的信仰 原文 | https://segmentfault.com/a/1190000013803247 本文介绍几个 8.0 在关系数据库方面的主要新特性. 你可能已经知道 MySQL ...
- accept 返回0_从0开始理解Vite的主要新特性(一)
此文已同步到公众号[因卓诶]以及因卓诶博客: 从0开始理解Vite的主要新特性(一) - 因卓诶-爱分享爱原创的技术博客 ~ 个人博客www.yinzhuoei.com vite这个工具确实尤大在微 ...
- Kafka 2.8.0 正式发布,增加了哪些新特性?
导读:目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐.可持久化.可水平扩展.支持流数据处理等多种特性而被广泛使用.目前越来越多的开源分布式处理系统如 Cloudera.Storm.Sp ...
- Spring Framework 5.2 正式发布,14项新特性一览
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | xplanet 来源 | http://oschina.net/news/1103 ...
- CentOS 7.6 MySQL 8.0 RPM包方式安装及新特性介绍
一.MySQL 8.0新特性: 1.默认字符集由latin1变为utf8mb4 2.MyISAM系统表全部换成InnoDB表 3.自增主键AUTO_INCREMENT的值支持持久化 4.InnoDB表 ...
- 重磅!阿里云MongoDB 5.0发布,速来围观新特性
简介:2021年9月29日下午,阿里云数据库与MongoDB共同发布了阿里云MongoDB 5.0.MongoDB于2021年7月中发布最新5.0版本,阿里云MongoDB率先跟进官方最新版本能力,快 ...
- php7.0 yield,PHP7中生成器的新特性 yield-from amp;amp; return-values
生成器委托 简单地翻译官方文档的描述: PHP7中,通过生成器委托(yield from),可以将其他生成器.可迭代的对象.数组委托给外层生成器.外层的生成器会先顺序 yield 委托出来的值,然后继 ...
- C#8.0的两个有趣的新特性以及gRPC
最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西.今天有空,稍微写一点. 下文中: 关于C#语法特性的部分需要Visual Studio 2019支持. 关于.NET Core的部分需要安装. ...
- c# 路径下的最近文件夹_C#8.0的两个有趣的新特性以及gRPC
最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西.今天有空,稍微写一点. 下文中: 关于C#语法特性的部分需要Visual Studio 2019支持. 关于.NET Core的部分需要安装. ...
最新文章
- 结构主题模型(一)stm包工作流
- 86句管理名言:管理=勤奋+智慧+知识+心理学
- js获取字符串的字节数
- 一文简单理解Java反射及使用
- git rebase之前需要 commit 才行
- php万能表单制作教程,万能表单系统
- 自费访学|计算机专业老师赴加拿大卡尔加里大学
- mysql 指数 类型_利用MYSQL挑选指数基金
- 视频分割软件有什么,怎么分割视频
- 回归预测 | MATLAB实现Robust-ELM鲁棒极限学习机多输入单输出
- PMBOK项目管理知识体系指南—PMP项目管理学习笔记。
- 首届“中新人工智能高峰论坛”即将召开,周志华、李德毅......与你一起对话未来!...
- 服务器之间的无线通讯,无线通讯技术之间的比较 - 常见无线通信(数据)传输技术 你知道哪些...
- java Date与 double 互转
- 【java毕业设计】基于java+BS的QQ屏幕截图工具设计与实现(毕业论文+程序源码)——屏幕截图工具
- 奥的斯电梯服务器自动呼梯,奥的斯MCS系统电梯轿厢内呼梯保密设置
- 安徽大学2021计算机考研专业课题型,安徽大学电子信息工程学院2021研究生入学考试科目调整通知...
- Java,配置Java环境
- 蚂蚁金服Java岗社招面试5面历程
- ED2K的资源链接如何进行下载?