熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring中的Object/XML映射詳解

2013-11-23 20:03:56  來源: Java開源技術 
    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(控制反轉)aspectorientedprogramming(面向方面編程)它還支持ModelViewController(MVC)模式很好地兼容用於數據訪問的各種數據庫驅動程序
   
    另外它支持事務處理單元測試批處理和安全性鑒於Spring的良好聲譽和悠久歷史它通常是應用程序快速開發的首選框架但是最大的好處也許是Spring是免費的
   
    Object/XML映射是什麼?
   
    Spring 的一個新特性是O/XMapperO/X映射器這個概念並不新鮮O代表ObjectX代表XML它的目的是在Java對象(幾乎總是一個plainoldJavaobject或簡寫為POJO)和XML文檔之間來回轉換
   
    例如您可能有一個帶有幾個屬性的簡單bean且您的業務需要將那個Java對象轉換為一個XML文檔Spring的O/XMapper能夠為您解決那個問題如果反過來您需要將一個XML文檔轉換為一個簡單JavabeanSpring的O/XMapper也能勝任有一點需要注意SpringO/XMapper只是定義由流行的第三方框架實現的統一的界面要利用Spring的O/X功能您需要一個在Java對象和XML之間來回轉換的實用程序Castor就是這樣一個流行的第三方工具本文將使用這個工具其他這樣的工具包括XMLBeansJavaArchitectureforXMLBinding(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:GenericMarshallingFailureExceptionValidationFailureExceptionMarshallingFailureException和UnmarshallingFailureException
   
    一個簡單的演示
   
    現在您已經了解了Spring的O/XMapper的背景和基礎知識可以檢驗它的使用方法了在本文中您首先創建一個簡單的Spring應用程序該程序獨立於任何JavaEnterprise依賴項然後您創建一個簡單的Java類它訪問Spring的配置文件來實例化該類並注入O/X依賴項參見下載部分獲取所有源代碼文件(包括配置文件)的鏈接
   
    編碼
   
    首先應該注意Spring配置文件清單是應用程序用於執行編組和解組操作的配置文件注意這個文件必須在運行時位於類路徑中清單配置文件
   
    <beansxmlnsbeansxmlns=
   
    xmlns:xsi=instance
   
    xsi:schemaLocation=
   
    beansxsd>
   
    <beanidbeanid=oxmExampleclass=comxyzOXMExample>
   
    <propertynamepropertyname=marshallerref=castorMarshaller/>
   
    <propertynamepropertyname=unmarshallerref=castorMarshaller/>
   
    </bean>
   
    <beanidbeanid=castorMarshallerclass=orgspringframeworkoxmcastorCastorMarshaller>
   
    <propertynamepropertyname=mappingLocationvalue=classpath:mappingxml/>
   
    </bean>
   
    </beans>
   
    如您所見這個配置文件只定義了兩個bean這是為了簡便起見第一個bean是用於執行演示的類comxyzOXMExample與該類關聯的兩個屬性使用依賴項注入它們都使用castorMarshallerbean的一個實例注入這是在Spring框架中定義bean的標准方法經驗豐富的Spring開發人員很快就會意識到這一點


   
    另一個bean是castorMarshallerbean本身它是orgspringframeworkoxmcastorCastorMarshaller的一個實例orgspringframeworkoxmcastorCastorMarshaller主要用於包裝Castor框架如前所述使用Spring的Object/XML功能需要使用一個第三方O/X框架在本例中這個第三方產品是Castor還要注意有一個屬性使用castorMarshaller定義那是用於在Javabean和XML輸出之間來回映射的映射文件這個文件稱為mappingxml它必須在運行時位於類路徑中我將稍後解釋mappingxml文件的內容清單實際執行O/X映射器的代碼的部分清單它是一個簡單的Java類清單OXMExample類
   
    publicclassOXMExample{
   
    privatestaticfinalStringFILE_NAME=simplebeanxml;
   
    privateSimpleBeansimpleBean;
   
    privateMarshallermarshaller;
   
    privateUnmarshallerunmarshaller;
   
    publicvoidsetMarshaller(Marshallermarshaller){
   
    thismarshaller=marshaller;
   
    }
   
    publicvoidsetUnmarshaller(Unmarshallerunmarshaller){
   
    thisunmarshaller=unmarshaller;
   
    }
   
    publicvoidsaveSimpleBean()throwsIOException{
   
    FileOutputStreamos=null;
   
    try{
   
    os=newFileOutputStream(FILE_NAME)
   
    thismarshallermarshal(simpleBeannewStreamResult(os))
   
    }finally{
   
    if(os!=null){
   
    osclose()
   
    }
   
    }
   
    }
   
    publicvoidloadSimpleBean()throwsIOException{
   
    FileInputStreamis=null;
   
    try{
   
    is=newFileInputStream(FILE_NAME)
   
    thissimpleBean
   
    =(SimpleBean)thisunmarshallerunmarshal(newStreamSource(is))
   
    }finally{
   
    if(is!=null){
   
    isclose()
   
    }
   
    }
   
    }
   
    publicstaticvoidmain(String[]args)throwsIOException{
   
    ApplicationContextappContext
   
    =newClassPathXmlApplicationContext(applicationContextxml
   
    OXMExampleex=(OXMExample)appContextgetBean(oxmExample
   
    exgo()
   
    }
   
    privatevoidgo()throwsIOException{
   
    simpleBean=getSimpleBean()
   
    saveSimpleBean()
   
    loadSimpleBean()
   
    Systemoutprintln(name:+simpleBeangetName())
   
    Systemoutprintln(jobdescription:+simpleBeangetJobDescription())
   
    Systemoutprintln(age:+simpleBeangetAge())
   
    Systemoutprintln(executive:+simpleBeanisExecutive())
   
    }
   
    privateSimpleBeangetSimpleBean(){
   
    SimpleBeansimpleBean=newSimpleBean()
   
    simpleBeansetAge(
   
    simpleBeansetExecutive(false)
   
    simpleBeansetJobDescription(Janitor
   
    simpleBeansetName(MisterJones
   
    returnsimpleBean;
   
    }
   
    }
   
    要解釋清單必須首先介紹main方法因為該方法將先執行然後再接著介紹清單首先在main方法中您的代碼捕獲Spring應用程序的上下文就是您在清單中看到的配置文件這個文件必須在類路徑中否則運行代碼將產生一個異常
   
    當您獲得應用程序上下文時OXMExample的一個實例從該配置文件中提供的定義創建注意這個bean在代碼中的名稱(oxmExample)與配置文件中定義的名稱(見清單)一致創建OXMExample的一個實例後調用go()方法這有點反常因為Spring框架實例化一個已經從命令行運行的對象但那只是為了實現演示目的而進行的簡化go()方法在打印結果數據前完成個任務
   
    創建SimpleBean的一個實例
   
    編組該實例
   
    解組從編組創建的XML文檔
   
    您使用getSimpleBean()方法實例化一個包含一個虛擬員工的信息的SimpleBean對象這個信息包含年齡(一個整數)工作描述(一個字符串)姓名(一個字符串)和該員工是否是執行官(一個布爾型)您使用測試數據和返回調用者的返回對象(在本例中為go()方法)填充字段您在編組發生時將這個bean寫入一個XML文件在解組發生時讀取那個XML文件的內容
   
    saveSimpleBean()方法執行編組首先您獲得一個指向simplebeanxml的對象然後您使用編組器對象(通過Spring的依賴項注入實例化)調用marshal方法這個方法需要兩個參數
   
    ◆要被編組的對象(本例中為SimpleBean實例)
   
    ◆一個StreamResult對象它基本上表示一個XML輸出抽象
   
    loadSimpleBean()方法執行解組首先您獲取一個指向simplebeanxml的FileInputStream對象然後您使用解組器對象(通過Spring的依賴項注入實例化)調用unmarshal方法唯一需要的參數是一個包裝FileInputStream對象的StreamSource對象注意解組將創建一個泛型對象因此您必須將其顯式設置為SimpleBean類型


   
    即使這個類和Spring配置文件已經就緒您也還沒有准備好運行這段代碼還記得清單中的映射文件嗎?您還需要定義那個映射文件定義代碼如清單所示而且再說一遍它也必須在運行時位於類路徑中清單mappingxml文件
   
    <mapping>
   
    <classnameclassname=comxyzSimpleBean>
   
    <maptoxmlmaptoxml=simplebean/>
   
    <fieldnamefieldname=agetype=integer>
   
    <bindxmlnamebindxmlname=agenode=element/>
   
    </field>
   
    <fieldnamefieldname=executivetype=boolean>
   
    <bindxmlnamebindxmlname=isexecutivenode=element/>
   
    </field>
   
    <fieldnamefieldname=jobDescriptiontype=string>
   
    <bindxmlnamebindxmlname=jobnode=element/>
   
    </field>
   
    <fieldnamefieldname=nametype=string>
   
    <bindxmlnamebindxmlname=namenode=element/>
   
    </field>
   
    </class>
   
    </mapping>
   
    清單中的映射文件特定於Object/XML映射的Castor實現第一個元素(class)定義要映射到一個XML輸出的類您必須指定完整路徑mapto元素提供XML文件的根元素的名稱這很重要因為XML規范規定每個XML文件必須有一個根元素
   
    每個field元素都將被映射到SimpleBean類中的一個特定字段每個field元素的bindxml子元素用於指定關於該字段的特定於XML的信息如對應的XML元素的名稱每個字段的值應該是一個元素值還是一個屬性值如您所見在本例中所有值都是元素值
   
    測試
   
    盡管代碼已經編寫完成但在執行這個應用程序之前您必須處理一些依賴項特定於Spring的依賴項有
   
    orgspringframeworkasmMjar
   
    orgspringframeworkbeansMjar
   
    orgntextMjar
   
    orgreMjar
   
    orgspringframeworkexpressionMjar
   
    orgspringframeworkoxmMjar
   
    特定於Castor的依賴項有
   
    castorcorejar
   
    castorxmljar
   
    您還需要commonsloggingjar和logjjar因為Spring框架需要它們所有這些JavaArchive(JAR)文件必須在運行時位於類路徑中如果您在沒有這些依賴項的情況下試圖運行代碼您很可能會收到一個異常指出某個類沒有找到如果遇到這種情況只需雙擊您的類路徑確保所有的必要依賴項已就緒事實上要成功編譯這段代碼您需要大部分JAR文件
   
    您可以使用您鐘愛的IDE或只是使用命令行來運行OXMExampleclass要從命令行運行只需從您的工作目錄輸入javacp[classpath]OXMExample這裡的[classpath]是指向剛才提到的所有依賴項(JAR文件和配置文件)的類路徑首次運行該程序後一個名為simplebeanxml的新文件將出現在您的工作目錄中該文件的內容應該如清單所示清單simplebeanxml文件
   
    <?xmlversionxmlversion=encoding=UTF?>
   
    <simplebean>
   
    <age></age>
   
    <isexecutive>false</isexecutive>
   
    <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實現比如CastorXBeansJiBXJAXB和XStream由於各個特定實現是Spring強大的InversionofControl容器的一部分開發人員可以在多個特定O/X實現之間輕松切換而無需修改代碼
   
    Spring的O/XMapper還向開發人員提供一個統一的異常層次結構這意味著不管您使用哪個第三方實現拋出的運行時異常都是相同的再強調一次這將有利於在多個O/X供應商之間切換在Java開發社區中提供XML支持的Java應用程序非常熱門並且Spring框架被廣泛使用因此Spring的O/XMapper將受到全世界Java應用程序開發人員的歡迎


From:http://tw.wingwit.com/Article/program/Java/ky/201311/27895.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.