oxm : 是spring 3.0的一个新特性 o/xMapping 什么是o/xMapping?
o/x mapping 入门:
功能:实践类与xml之间的相互转换。
编组:marshalling 将javabean转化为xml
解组:unmarshalling 将xml转化为JavaBean
好处:
1.因为spring的bean库支持实例化o/x编组的注入,所以使用xml编写的bean也可以注入spring中使用。这样做可以将程序和配置分类处理。结构更清晰。 2.o/x使用面向接口的形式开发,所以单独的开发者不需要关注其实现细节,并且想要改变其实现方式,只需要修改o/x的实现配置即可。
3.异常类型层次结构化,spring把实现原厂的异常进行了自己的封装。并且是运行时异常!这样做可以更精准的定位异常。
代码demo:
maven pom文件信息:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spider</groupId>
<artifactId>SpringOXM</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--spring核心-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!--oxm功能类jar-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!--oxm功能类jar-->
<dependency>
<groupId>org.codehaus.castor</groupId>
<artifactId>castor</artifactId>
<version>1.3.2</version>
<type>pom</type>
</dependency>
<!--oxm功能类jar-->
<dependency>
<groupId>org.codehaus.castor</groupId>
<artifactId>castor-xml</artifactId>
<version>1.3.2</version>
</dependency>
<!--spring上下文-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
</dependencies>
</project>
配置文件设置:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--将编组和解组功能导入到oxmDemo类中-->
<bean id="oxmDemo" class="com.spider.OxmDemo">
<property name="marshaller" ref="castorMarshaller" />
<property name="unmarshaller" ref="castorMarshaller" />
</bean>
<!-- 引入castor包:castor-1.3.2-core.jar,castor-1.3.2-xml.jar -->
<bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller">
<!--包含映射关系的xml,如果不添加,解组时无法解析root元素-->
<property name="mappingLocation" value="classpath:mapping.xml" />
</bean>
</beans>
oxmDemo:编组解组调用类:
package com.spider;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class OxmDemo {
private Marshaller marshaller;//编组类
private Unmarshaller unmarshaller;//解组类
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;
}
/**
* @param object 编码对象
* @param filepath xml输出路径
* @throws IOException io异常
*/
public void converFromObjectToXML(Object object,String filepath) throws IOException {
FileOutputStream os = null;
try{
os = new FileOutputStream(filepath);
getMarshaller().marshal(object,new StreamResult(os));
}finally {
if(os!=null){
os.close();
}
}
}
/**
* @param xmlfile xml文件位置
* @return
* @throws IOException
*/
public Object converFromXMLToObject(String xmlfile) throws IOException{
FileInputStream is = null;
try{
is = new FileInputStream(xmlfile);
return getUnmarshaller().unmarshal(new StreamSource(is));
}finally {
if(is!=null){
is.close();
}
}
}
}
Customer:model类
package com.spider.model;
public class Customer {
private String name;
private String sex;
private Boolean flag;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean flag) {
this.flag = flag;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", flag=" + flag +
'}';
}
}
测试类:
import com.spider.OxmDemo;
import com.spider.model.Customer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
public class MyTest {
private static final String XML_FILE_NAME = "E:\\spider-developer\\SpringOXM\\customer.xml";//文件输出位置
public static void main(String[] args) throws IOException {
ApplicationContext appContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
OxmDemo oxmDemo = (OxmDemo) appContext.getBean("oxmDemo");
Customer customer = new Customer();
customer.setName("xiaowan");
customer.setFlag(false);
customer.setSex("man");
System.out.println("Conver Object to XML");
oxmDemo.converFromObjectToXML(customer,XML_FILE_NAME);
System.out.println("Done /n");
System.out.println("Conver XML to Object");
Customer result = (Customer) oxmDemo.converFromXMLToObject(XML_FILE_NAME);
System.out.println(result);
}
}
console结果显示:
Conver XML to Object
Customer{name='xiaowan', sex='man', flag=false}
Process finished with exit code 0
调用编组时调用Marshaller下的void marshal(Object var1, Result var2)方法,解组时调用Unmarshaller下的Object unmarshal(Source var1)方法。
源码: