Spring 3.0 OXM - Spring 3.0 框架新特性

来源:互联网 发布:淘宝充值网易宝 编辑:程序博客网 时间:2024/04/30 06:23

什么是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.    
  26.     <!-- Properties -->  
  27.     <properties>  
  28.         <spring-version>3.0.0.RELEASE</spring-version>  
  29.     </properties>  
  30.    
  31.     <!-- Dependencies -->  
  32.     <dependencies>  
  33.         <!-- Spring framework -->  
  34.         <dependency>  
  35.             <groupId>org.springframework</groupId>  
  36.             <artifactId>spring-core</artifactId>  
  37.             <version>${spring-version}</version>  
  38.         </dependency>  
  39.         <dependency>  
  40.             <groupId>org.springframework</groupId>  
  41.             <artifactId>spring-beans</artifactId>  
  42.             <version>${spring-version}</version>  
  43.         </dependency>  
  44.         <dependency>  
  45.             <groupId>org.springframework</groupId>  
  46.             <artifactId>spring-oxm</artifactId>  
  47.             <version>${spring-version}</version>  
  48.         </dependency>  
  49.    
  50.         <!-- Castor Xml -->  
  51.         <dependency>  
  52.             <groupId>org.codehaus.castor</groupId>  
  53.             <artifactId>castor</artifactId>  
  54.             <version>1.2</version>  
  55.         </dependency>  
  56.         <dependency>  
  57.             <groupId>xerces</groupId>  
  58.             <artifactId>xercesImpl</artifactId>  
  59.             <version>2.9.1</version>  
  60.         </dependency>  
  61.    
  62.         <!-- Logging -->  
  63.         <dependency>  
  64.             <groupId>commons-logging</groupId>  
  65.             <artifactId>commons-logging</artifactId>  
  66.             <version>1.1.1</version>  
  67.         </dependency>  
  68.    
  69.         <!-- Test dependencies -->  
  70.         <dependency>  
  71.             <groupId>junit</groupId>  
  72.             <artifactId>junit</artifactId>  
  73.             <version>4.4</version>  
  74.             <scope>test</scope>  
  75.         </dependency>  
  76.     </dependencies>  
  77. </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.    
  26.     <!-- Properties -->  
  27.     <properties>  
  28.         <spring-version>3.0.0.RELEASE</spring-version>  
  29.     </properties>  
  30.    
  31.     <!-- Dependencies -->  
  32.     <dependencies>  
  33.         <!-- Spring framework -->  
  34.         <dependency>  
  35.             <groupId>org.springframework</groupId>  
  36.             <artifactId>spring-core</artifactId>  
  37.             <version>${spring-version}</version>  
  38.         </dependency>  
  39.         <dependency>  
  40.             <groupId>org.springframework</groupId>  
  41.             <artifactId>spring-beans</artifactId>  
  42.             <version>${spring-version}</version>  
  43.         </dependency>  
  44.         <dependency>  
  45.             <groupId>org.springframework</groupId>  
  46.             <artifactId>spring-oxm</artifactId>  
  47.             <version>${spring-version}</version>  
  48.         </dependency>  
  49.    
  50.         <!-- Castor Xml -->  
  51.         <dependency>  
  52.             <groupId>org.codehaus.castor</groupId>  
  53.             <artifactId>castor</artifactId>  
  54.             <version>1.2</version>  
  55.         </dependency>  
  56.         <dependency>  
  57.             <groupId>xerces</groupId>  
  58.             <artifactId>xercesImpl</artifactId>  
  59.             <version>2.9.1</version>  
  60.         </dependency>  
  61.    
  62.         <!-- Logging -->  
  63.         <dependency>  
  64.             <groupId>commons-logging</groupId>  
  65.             <artifactId>commons-logging</artifactId>  
  66.             <version>1.1.1</version>  
  67.         </dependency>  
  68.    
  69.         <!-- Test dependencies -->  
  70.         <dependency>  
  71.             <groupId>junit</groupId>  
  72.             <artifactId>junit</artifactId>  
  73.             <version>4.4</version>  
  74.             <scope>test</scope>  
  75.         </dependency>  
  76.     </dependencies>  
  77. </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.    
  3. public class Person {  
  4.    
  5.     private String firstname;  
  6.       
  7.     private String lastname;  
  8.       
  9.     private boolean developer;  
  10.    
  11.     public String getFirstname() {  
  12.         return firstname;  
  13.     }  
  14.    
  15.     public void setFirstname(String firstname) {  
  16.         this.firstname = firstname;  
  17.     }  
  18.    
  19.     public String getLastname() {  
  20.         return lastname;  
  21.     }  
  22.    
  23.     public void setLastname(String lastname) {  
  24.         this.lastname = lastname;  
  25.     }  
  26.    
  27.     public boolean isDeveloper() {  
  28.         return developer;  
  29.     }  
  30.    
  31.     public void setDeveloper(boolean developer) {  
  32.         this.developer = developer;  
  33.     }   
  34.       
  35. }  
Java代码  收藏代码
  1. package com.unitedcoders.examples.spring.oxm.beans;  
  2.    
  3. public class Person {  
  4.    
  5.     private String firstname;  
  6.       
  7.     private String lastname;  
  8.       
  9.     private boolean developer;  
  10.    
  11.     public String getFirstname() {  
  12.         return firstname;  
  13.     }  
  14.    
  15.     public void setFirstname(String firstname) {  
  16.         this.firstname = firstname;  
  17.     }  
  18.    
  19.     public String getLastname() {  
  20.         return lastname;  
  21.     }  
  22.    
  23.     public void setLastname(String lastname) {  
  24.         this.lastname = lastname;  
  25.     }  
  26.    
  27.     public boolean isDeveloper() {  
  28.         return developer;  
  29.     }  
  30.    
  31.     public void setDeveloper(boolean developer) {  
  32.         this.developer = developer;  
  33.     }   
  34.       
  35. }  

   

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

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

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

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