知识大全 Spring中的Object/XML映射详解

Posted 文件

篇首语:日日行不怕千万里,天天讲不吝千万言,时时做不惧千万事。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring中的Object/XML映射详解相关的知识,希望对你有一定的参考价值。

Spring中的Object/XML映射详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    Spring正在成为JavaEE社区内一个非常受欢迎的框架 Spring的最新版本的特性之一是它的Object/XML(O/X)映射支持 这个API支持开发人员在Java对象和XML之间来回转换 在本文中 您将学习如何使用Spring中的Object/XML映射特性并了解它的优势         Spring作为Java应用程序框架 已在Java开发社区中得到广泛使用 SpringSource近日发布了最新版本Spring 版本 文章主要针对Spring中的Object/XML映射 分析使用Object/XML映射的特性与优势         Spring以其流行的科技词汇而著名 比如 dependencyinjection(依赖项注入) inversionofcontrol(控制反转) 和 aspect orientedprogramming(面向方面编程) 等 它还支持Model View Controller(MVC)模式 很好地兼容用于数据访问的各种数据库驱动程序         另外 它支持事务处理 单元测试 批处理和安全性 鉴于Spring的良好声誉和悠久历史 它通常是应用程序快速开发的首选框架 但是 最大的好处也许是 Spring是免费的         Object/XML映射是什么?        Spring 的一个新特性是O/XMapper O/X映射器这个概念并不新鲜 O代表Object X代表XML 它的目的是在Java对象(几乎总是一个plainoldJavaobject 或简写为POJO)和XML文档之间来回转换         例如 您可能有一个带有几个属性的简单bean 且您的业务需要将那个Java对象转换为一个XML文档 Spring的O/XMapper能够为您解决那个问题 如果反过来 您需要将一个XML文档转换为一个简单Javabean Spring的O/XMapper也能胜任 有一点需要注意 SpringO/XMapper只是定义由流行的第三方框架实现的统一的界面 要利用Spring的O/X功能 您需要一个在Java对象和XML之间来回转换的实用程序 Castor就是这样一个流行的第三方工具 本文将使用这个工具 其他这样的工具包括XMLBeans JavaArchitectureforXMLBinding(JAXB) JiBX和XStream         编组和解组        进行O/X映射时 您经常会看到编组(marshalling)和解组(unmarshalling)这两个术语 编组指将Javabean转换成XML文档的过程 这意味着Javabean的所有字段和字段值都将作为XML元素或属性填充到XML文件中 有时 编组也称为序列化(serializing)         如您所料 解组是与编组完全相反的过程 即将XML文档转换为Javabean 这意味着XML文档的所有元素或属性都作为Java字段填充到Javabean中 有时 解组也称为反序列化(deserializing)         使用Spring的O/XMapper的好处        使用Spring的O/XMapper的一个最直接的好处是可以通过利用Spring框架的其他特性简化配置 Spring的bean库支持将实例化的O/X编组器注入(即前面提到过的 依赖项注入 )使用那些编组器的对象 重申一遍 这将加快应用程序开发和部署         遵循坚实的面向对象的设计实践 Spring Object/XML框架只定义两个接口 Marshaller和Unmarshaller 它们用于执行O/X功能 这是使用这个框架的另一个重大好处 这些接口的实现完全对独立开发人员开放 开发人员可以轻松切换它们而无需修改代码 例如 如果您一开始使用Castor进行O/X转换 但后来发现它缺乏您需要的某个功能 这时您可以切换到XMLBeans而无需任何代码更改 唯一需要做的就是更改Spring配置文件以使用新的Object/XML框架         使用Spring的Object/XML映射的另一个好处是统一的异常层次结构 Spring框架遵循使用它的数据访问模块建立的模式 方法是将原始异常对象包装到Spring自身专为O/XMapper建立的运行时异常中 由于第三方提供商抛出的原始异常被包装到Spring运行时异常中 您能够查明出现异常的根本原因 您也不必费心修改代码以捕获异常 因为异常已包装到一个运行时异常中 以下几个运行时异常扩展了基础异常        XMLMappingException:GenericMarshallingFailureException ValidationFailureException MarshallingFailureException和UnmarshallingFailureException         一个简单的演示        现在您已经了解了Spring的O/XMapper的背景和基础知识 可以检验它的使用方法了 在本文中 您首先创建一个简单的Spring应用程序 该程序独立于任何JavaEnterprise依赖项 然后 您创建一个简单的Java类 它访问Spring的配置文件来实例化该类并注入O/X依赖项 参见下载部分获取所有源代码文件(包括配置文件)的链接         编码        首先应该注意Spring配置文件 清单 是应用程序用于执行编组和解组操作的配置文件 注意 这个文件必须在运行时位于类路径中 清单 配置文件         <beansxmlnsbeansxmlns=         xmlns:xsi= instance         xsi:schemaLocation=         beans xsd >        <beanidbeanid= oxmExample class= xyz OXMExample >        <propertynamepropertyname= marshaller ref= castorMarshaller />        <propertynamepropertyname= unmarshaller ref= castorMarshaller />        </bean>        <beanidbeanid= castorMarshaller class= springframework oxm castor CastorMarshaller >        <propertynamepropertyname= mappingLocation value= classpath:mapping xml />        </bean>        </beans>        如您所见 这个配置文件只定义了两个bean 这是为了简便起见 第一个bean是用于执行演示的类 xyz OXMExample 与该类关联的两个属性使用依赖项注入 它们都使用castorMarshallerbean的一个实例注入 这是在Spring框架中定义bean的标准方法 经验丰富的Spring开发人员很快就会意识到这一点         另一个bean是castorMarshallerbean本身 它是 springframework oxm castor CastorMarshaller的一个实例 springframework oxm castor CastorMarshaller主要用于包装Castor框架 如前所述 使用Spring的Object/XML功能需要使用一个第三方O/X框架 在本例中 这个第三方产品是Castor 还要注意 有一个属性使用castorMarshaller定义 那是用于在Javabean和XML输出之间来回映射的映射文件 这个文件称为mapping xml 它必须在运行时位于类路径中 我将稍后解释mapping xml文件的内容 清单 实际执行O/X映射器的代码的部分清单 它是一个简单的Java类 清单 OXMExample类         publicclassOXMExample        privatestaticfinalStringFILE_NAME= simplebean xml ;        privateSimpleBeansimpleBean;        privateMarshallermarshaller;        privateUnmarshallerunmarshaller;        publicvoidsetMarshaller(Marshallermarshaller)        this marshaller=marshaller;                publicvoidsetUnmarshaller(Unmarshallerunmarshaller)        this unmarshaller=unmarshaller;                publicvoidsaveSimpleBean()throwsIOException        FileOutputStreamos=null;        try        os=newFileOutputStream(FILE_NAME)         this marshaller marshal(simpleBean newStreamResult(os))         finally        if(os!=null)        os close()                                 publicvoidloadSimpleBean()throwsIOException        FileInputStreamis=null;        try        is=newFileInputStream(FILE_NAME)         this simpleBean        =(SimpleBean)this unmarshaller unmarshal(newStreamSource(is))         finally        if(is!=null)        is close()                                 publicstaticvoidmain(String[]args)throwsIOException        ApplicationContextappContext        =newClassPathXmlApplicationContext( applicationContext xml )         OXMExampleex=(OXMExample)appContext getBean( oxmExample )         ex go()                 privatevoidgo()throwsIOException        simpleBean=getSimpleBean()         saveSimpleBean()         loadSimpleBean()         System out println( name: +simpleBean getName())         System out println( jobdescription: +simpleBean getJobDescription())         System out println( age: +simpleBean getAge())         System out println( executive: +simpleBean isExecutive())                 privateSimpleBeangetSimpleBean()        SimpleBeansimpleBean=newSimpleBean()         simpleBean setAge( )         simpleBean setExecutive(false)         simpleBean setJobDescription( Janitor )         simpleBean setName( MisterJones )         returnsimpleBean;                        要解释清单 必须首先介绍main方法 因为该方法将先执行 然后再接着介绍清单 首先 在main方法中 您的代码捕获Spring应用程序的上下文 就是您在清单 中看到的配置文件 这个文件必须在类路径中 否则运行代码将产生一个异常         当您获得应用程序上下文时 OXMExample的一个实例从该配置文件中提供的定义创建 注意 这个bean在代码中的名称(oxmExample)与配置文件中定义的名称(见清单 )一致 创建OXMExample的一个实例后 调用go()方法 这有点反常 因为Spring框架实例化一个已经从命令行运行的对象 但那只是为了实现演示目的而进行的简化 go()方法在打印结果数据前完成 个任务         创建SimpleBean的一个实例         编组该实例         解组从编组创建的XML文档         您使用getSimpleBean()方法实例化一个包含一个虚拟员工的信息的SimpleBean对象 这个信息包含年龄(一个整数) 工作描述(一个字符串) 姓名(一个字符串)和该员工是否是执行官(一个布尔型) 您使用测试数据和返回调用者的返回对象(在本例中为go()方法)填充字段 您在编组发生时将这个bean写入一个XML文件 在解组发生时读取那个XML文件的内容         saveSimpleBean()方法执行编组 首先 您获得一个指向simplebean xml的对象 然后 您使用编组器对象(通过Spring的依赖项注入实例化)调用marshal方法 这个方法需要两个参数         ◆要被编组的对象(本例中为SimpleBean实例)        ◆一个StreamResult对象 它基本上表示一个XML输出抽象        loadSimpleBean()方法执行解组 首先 您获取一个指向simplebean xml的FileInputStream对象 然后 您使用解组器对象(通过Spring的依赖项注入实例化)调用unmarshal方法 唯一需要的参数是一个包装FileInputStream对象的StreamSource对象 注意 解组将创建一个泛型对象 因此您必须将其显式设置为SimpleBean类型         即使这个类和Spring配置文件已经就绪 您也还没有准备好运行这段代码 还记得清单 中的映射文件吗?您还需要定义那个映射文件 定义代码如清单 所示 而且 再说一遍 它也必须在运行时位于类路径中 清单 mapping xml文件         <mapping>        <classnameclassname= xyz SimpleBean >        <map toxmlmap toxml= simplebean />        <fieldnamefieldname= age type= integer >        <bind xmlnamebind xmlname= age node= element />        </field>        <fieldnamefieldname= executive type= boolean >        <bind xmlnamebind xmlname= is executive node= element />        </field>        <fieldnamefieldname= jobDescription type= string >        <bind xmlnamebind xmlname= job node= element />        </field>        <fieldnamefieldname= name type= string >        <bind xmlnamebind xmlname= name node= element />        </field>        </class>        </mapping>        清单 中的映射文件特定于Object/XML映射的Castor实现 第一个元素(class)定义要映射到一个XML输出的类 您必须指定完整路径 map to元素提供XML文件的根元素的名称 这很重要 因为XML规范规定 每个XML文件必须有一个根元素         每个field元素都将被映射到SimpleBean类中的一个特定字段 每个field元素的bind xml子元素用于指定关于该字段的特定于XML的信息 如对应的XML元素的名称 每个字段的值应该是一个元素值还是一个属性值 如您所见 在本例中 所有值都是元素值         测试        尽管代码已经编写完成 但在执行这个应用程序之前 您必须处理一些依赖项 特定于Spring的依赖项有         springframework asm M jar        springframework beans M jar        ntext M jar        re M jar        springframework expression M jar        springframework oxm M jar        特定于Castor的依赖项有         castor core jar        castor xml jar        您还需要mons logging jar和log j jar 因为Spring框架需要它们 所有这些JavaArchive(JAR)文件必须在运行时位于类路径中 如果您在没有这些依赖项的情况下试图运行代码 您很可能会收到一个异常 指出某个类没有找到 如果遇到这种情况 只需双击您的类路径 确保所有的必要依赖项已就绪 事实上 要成功编译这段代码 您需要大部分JAR文件         您可以使用您钟爱的IDE或只是使用命令行来运行OXMExample class 要从命令行运行 只需从您的工作目录输入java cp[classpath]OXMExample 这里的[classpath]是指向刚才提到的所有依赖项(JAR文件和配置文件)的类路径 首次运行该程序后 一个名为simplebean xml的新文件将出现在您的工作目录中 该文件的内容应该如清单 所示 清单 simplebean xml文件         <?xmlversionxmlversion= encoding= UTF ?>        <simplebean>        <age> </age>        <is executive>false</is executive>        <job>Janitor</job>        <name>MisterJones</name>        </simplebean>        清单 显示了来自应用程序的编组端的输出 而清单 则显示来自应用程序的解组端的结果 这些结果将在您的控制台中显示 清单 解组输出         name:MisterJones        jobdescription:Janitor        age:         executive:false        现在 您已经成功地完成了您的首次SpringO/X映射测试 现在最好做开发人员应该做的工作 修改代码 向类添加字段并将它们映射到XML文件 删除一些字段并将它们从XML文件中移除 参考Castor文档 尝试一些更复杂的工作 比如嵌套元素 您可以随心所欲地尝试各种可能性         结束语        Spring的O/X映射接口是Spring框架的强大特性 借助它 您不仅可以将XML文档转换为Java对象 还可以将Java对象转换为XML文档 它利用Spring的一个关键优势 依赖项注入 通过结合使用依赖项注入和Spring的O/XMapper 您可以轻松开发一个解决方案 该方案可以使用任一O/X实现 比如Castor XBeans JiBX JAXB和XStream 由于各个特定实现是Spring强大的InversionofControl容器的一部分 开发人员可以在多个特定O/X实现之间轻松切换而无需修改代码         Spring的O/XMapper还向开发人员提供一个统一的异常层次结构 这意味着不管您使用哪个第三方实现 抛出的运行时异常都是相同的 再强调一次 这将有利于在多个O/X供应商之间切换 在Java开发社区中 提供XML支持的Java应用程序非常热门并且Spring框架被广泛使用 因此Spring的O/XMapper将受到全世界Java应用程序开发人员的欢迎 cha138/Article/program/Java/ky/201311/27895

相关参考

知识大全 Spring动态加载Hibernate映射文件

Spring动态加载Hibernate映射文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 详解Spring的配置文件

详解Spring的配置文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  想必用过Spring的

知识大全 Spring中IoC的入门实例详解

Spring中IoC的入门实例详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Spring的

知识大全 Spring AOP 详解

SpringAOP详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  此前对于AOP的使用仅限于

知识大全 Spring中事务的传播属性详解

Spring中事务的传播属性详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我们用Sprin

知识大全 Spring jar包详解

Springjar包详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &n

知识大全 详解Spring中bean的scope

详解Spring中bean的scope  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如何使用s

知识大全 spring连接池配置详解

  数据库连接池概述  数据库连接是一种关键的有限的昂贵的资源这一点在多用户的网页应用程序中体现得尤为突出对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性影响到程序的性能指标数据库连接池正是

知识大全 ibatis+spring 集成

  作为开源的Orm对象映射框架ibatis是一个线程安全学习容易但是开发相对于hibernate来说的话就要繁锁些没有很好的工具支持ibatis所有的配置几乎是通过手写这样增加了开发者的难度好啦言归

知识大全 自然的访问spring容器中的bean

   Spring依赖其IOC特征轻松的管理著一堆非常有价值的bean这些bean在spring容器中的依赖关系都已注入好所以相互调用非常方便  但既然是有价值的bean