專利名稱:一種Spring IOC配置文件的生成方法
—種Spring IOC配置文件的生成方法
所屬技術(shù)領(lǐng)域4本發(fā)明屬于計(jì)算機(jī)應(yīng)用開發(fā)領(lǐng)域,涉及XML數(shù)據(jù)綁定技術(shù),具體涉及一種程序化生成Spring IOC配置文件的方法。
背景技術(shù):
Spring作為解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的開源框架,是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IOC, Inversion of Control)和面向切面的容器框架,亦是Java開發(fā)領(lǐng)域最為流行的開源框架,被廣泛用于企業(yè)應(yīng)用軟件以及政府信息系統(tǒng)的設(shè)計(jì)與研發(fā)。例如中國專利公開號(hào)CN101996071A,利用Spring框架封裝實(shí)現(xiàn)所述對(duì)象數(shù)據(jù)操作命令的Java類文件; 中國專利公開號(hào)CN101097615,將Spring用于服務(wù)的管理,進(jìn)而實(shí)現(xiàn)一網(wǎng)行政審批信息系統(tǒng)架構(gòu)。Spring使用基本的JavaBean規(guī)范來完成以前只可能由EJB完成的事情,并致力于J2EE應(yīng)用的表現(xiàn)層、業(yè)務(wù)層以及持久層等各層的解決方案,基于Spring框架,能夠輕松實(shí)現(xiàn)控制反轉(zhuǎn)與依賴注入、面向切面編程以及聲明式事務(wù)支持等功能。其中,控制反轉(zhuǎn)和依賴注入功能借助于Java的反射特性,通過遍歷讀取IOC配置文件來創(chuàng)建Java對(duì)象,進(jìn)而實(shí)現(xiàn)對(duì)象創(chuàng)建與使用的分離,是Spring框架的核心機(jī)制之一。凡是符合Spring Beans的 Schema規(guī)范的配置文件均可被Spring框架正確解析,進(jìn)而創(chuàng)建相應(yīng)的Java對(duì)象。XML是可擴(kuò)展的標(biāo)記語言,是W3C組織發(fā)布的用于定義互聯(lián)網(wǎng)上數(shù)據(jù)描述與數(shù)據(jù)交換的一種標(biāo)準(zhǔn),由于其自身良好的跨平臺(tái)性、可移植性等特點(diǎn),目前已被廣泛應(yīng)用于軟件項(xiàng)目中。在Java開發(fā)領(lǐng)域,越來越多的軟件項(xiàng)目采用XML作為其數(shù)據(jù)描述或者數(shù)據(jù)交換的格式,且絕大多數(shù)開發(fā)框架均支持或者只支持XML格式的配置文件,如Spring、Struts以及 Hibernate 等。XML數(shù)據(jù)綁定是指從結(jié)構(gòu)化的XML組件(如元素和屬性)到保留組件邏輯層次的數(shù)據(jù)模型(如Java對(duì)象)的映射,它既表示了數(shù)據(jù)的真正含義,也用程序設(shè)計(jì)語言的原本格式表示組件。XML數(shù)據(jù)綁定有兩個(gè)重要的概念編組和解組。編組是指將對(duì)象模型實(shí)例轉(zhuǎn)換為XML實(shí)例,反之,從XML實(shí)例至對(duì)象模型實(shí)例為解組,如圖I所示。XML數(shù)據(jù)綁定提供了一種簡單而直接的方法,使應(yīng)用程序能夠方便的使用XML來保存對(duì)象模型的數(shù)據(jù),進(jìn)而達(dá)到數(shù)據(jù)交換或者應(yīng)用配置的作用。Spring框架解析IOC配置文件并創(chuàng)建相應(yīng)的Java對(duì)象可以理解為解組的過程,而本發(fā)明對(duì)應(yīng)的實(shí)施例可以將Java對(duì)象編組為Spring IOC格式的XML文件。一般來說,有兩種選擇實(shí)現(xiàn)XML實(shí)例到Java對(duì)象模型的綁定⑴利用XML數(shù)據(jù)綁定框架;(2)利用Dom4j、Jdom等API編寫數(shù)據(jù)綁定應(yīng)用程序。目前,Java開發(fā)領(lǐng)域的XML數(shù)據(jù)綁定框架主要有Castor、Simple、XStream、 Digester、Jaxb> Jibx、XmlBeans 等。Castor是ExoLab Group的開放源代碼項(xiàng)目之一,主要目標(biāo)是提供Java對(duì)象實(shí)例與XML文件實(shí)例間的綁定,同時(shí)提供SQL和LDAP綁定。Castor利用JavaBean的setter 和getter方法實(shí)現(xiàn)對(duì)象實(shí)例的編組與解組,且可以根據(jù)需要選擇性的使用映射配置文件。Castor的默認(rèn)映射規(guī)則主要有兩點(diǎn)(1)對(duì)象實(shí)例的基本數(shù)據(jù)類型屬性以節(jié)點(diǎn)屬性的形式編組到XML文件中;(2)對(duì)象實(shí)例的高級(jí)對(duì)象類型屬性以子節(jié)點(diǎn)的形式編組到XML文件中。 Castor數(shù)據(jù)綁定框架的不足之處是利用默認(rèn)映射規(guī)則生成復(fù)雜嵌套對(duì)象的XML文件格式復(fù)雜,不易閱讀與交換,而映射文件的學(xué)習(xí)成本較大;多層次對(duì)象的相互引用無法正確編組到XML文件。Simple是一個(gè)高性能的XML數(shù)據(jù)綁定和配置框架。它提供完整的對(duì)象編組與解組功能,并能夠保持它們的關(guān)聯(lián)關(guān)系。Simple利用注解方式配置XML結(jié)構(gòu),支持?jǐn)?shù)組以及 List、Map等任意集合對(duì)象,并提供完全的命名空間支持,允許版本管理框架向前和向后兼容序列化。相對(duì)于其它XML數(shù)據(jù)綁定框架來說,Simple框架具有速度快、配置簡單等特點(diǎn), 對(duì)于構(gòu)造器、模板過濾器等也有很好的支持。但Simple框架不能正確的編組多層次對(duì)象的相互引用(相互引用會(huì)導(dǎo)致Simple在編組過程中出現(xiàn)異常)等復(fù)雜對(duì)象。XStream數(shù)據(jù)綁定框架的特點(diǎn)是不用任何映射就能實(shí)現(xiàn)多數(shù)Java對(duì)象的序列化, 支持多種XML解析器。XStream將對(duì)象以及對(duì)象的屬性名稱轉(zhuǎn)換為XML的節(jié)點(diǎn)名稱,屬性的值轉(zhuǎn)換為XML節(jié)點(diǎn)的文本。和其它數(shù)據(jù)綁定框架相比,XStream有三個(gè)突出的特點(diǎn)(I)不關(guān)心序列化/逆序列化的類的字段的可見性;(2)序列化/逆序列化類的字段不需要getter 和setter方法;(3)序列化/逆序列化的類不需要有默認(rèn)構(gòu)造函數(shù)。也就是說,在不作任何修改的情況下,使用XStream就能直接序列化/逆序列化任何第三方類。正是因?yàn)閄Stream 無需任何配置即可直接序列化/逆序列化任何第三方類,導(dǎo)致XML文檔中的自定義元素名稱以及屬性展現(xiàn)方式均需要在序列化代碼中硬編碼實(shí)現(xiàn)。Jaxb (Java Architecture for XML Binding)作為 Java 規(guī)范的實(shí)現(xiàn),提供了一個(gè)快速便捷的方式將Java對(duì)象與XML進(jìn)行轉(zhuǎn)換,已經(jīng)被納入到JavaSE 6. O的標(biāo)準(zhǔn)庫中。同時(shí),在 JAX-WS(Java 的 WebService 規(guī)范之一)中,JavaSE 6.0 自帶的版本 JAX-WS2. 1,其底層支持就是Jaxb。Jaxb亦支持注解方式將Java對(duì)象綁定到一段XML,同時(shí)可以使用Jaxb的 XJC工具,通過定義Schema的方式實(shí)現(xiàn)Java對(duì)象與XML的綁定。Jaxb在轉(zhuǎn)換效率以及配置方面均可以和Simple進(jìn)行媲美,其不足之處亦與Simple框架類似,即不能正確的編組多層次對(duì)象的相互引用等復(fù)雜對(duì)象。利用Dom4j、Jdom等API編寫數(shù)據(jù)綁定應(yīng)用程序是實(shí)現(xiàn) XML實(shí)例到Java對(duì)象模型綁定的又一解決方案。如,中國專利公開號(hào)CN101339500A,提出了一種基于XML模式的數(shù)據(jù)綁定應(yīng)用程序接口生成方法;中國專利公開號(hào)CN101699397A, 實(shí)現(xiàn)了一種Java與XML數(shù)據(jù)綁定的方法。為實(shí)現(xiàn)某些特定的需求,有部分項(xiàng)目也選擇利用 Dom4j、Jdom等API編寫應(yīng)用程序?qū)崿F(xiàn)XML實(shí)例到Java對(duì)象模型的綁定。然而,這些應(yīng)用程序最大不足在于硬編碼過多,導(dǎo)致靈活性和可擴(kuò)展性有所欠缺。綜上所述,這些框架、專利或程序在配置、編組效率以及靈活性等方面各有所長, 但相對(duì)于本發(fā)明對(duì)應(yīng)的實(shí)施例來說,具備如下不足(I)多層次對(duì)象不能相互引用。上述數(shù)據(jù)綁定框架均采用XML的層次嵌套方式來解決對(duì)象實(shí)例中對(duì)另一個(gè)對(duì)象的引用。如圖I所示,學(xué)生對(duì)象實(shí)例(Student)中對(duì)地址對(duì)象實(shí)例(Address)的引用多體現(xiàn)為學(xué)生節(jié)點(diǎn)(〈Student〉)中包含(〈Address〉)節(jié)點(diǎn)。這種層次嵌套方式從根本上就無法解決多層次對(duì)象相互引用(例如學(xué)生對(duì)象實(shí)例有個(gè)屬性為班主任實(shí)例,而班主任對(duì)象實(shí)例也有個(gè)學(xué)生實(shí)例的列表)的數(shù)據(jù)綁定問題,而只能利用一端的綁定來編寫代碼手動(dòng)注入另外一端的綁定。而Spring IOC配置文件可以很好的定義多層次對(duì)象的相互引用且能被Spring框架正確的解組為Java對(duì)象實(shí)例。(2)無法與Spring框架無縫集成。上述框架、專利或者程序均是將Java對(duì)象編組為普通的XML文件實(shí)例,無法被Spring框架解析。Spring框架作為當(dāng)今Java開發(fā)領(lǐng)域最為流行的開源框架,能夠?yàn)镴ava應(yīng)用的表現(xiàn)層、業(yè)務(wù)層以及持久層等各層提供優(yōu)秀的解決方案。與Spring框架無縫集成,能夠無縫引用Spring框架上下文定義的其它對(duì)象,是發(fā)明實(shí)施例的一大特點(diǎn)。(3)單一輸出文件。上述框架、專利或者程序均局限于將某個(gè)Java對(duì)象編組到某個(gè)XML文件,而無法實(shí)現(xiàn)對(duì)象的多文件編組輸出以及互不關(guān)聯(lián)的多個(gè)對(duì)象實(shí)例同時(shí)輸出。 在以Spring框架為核心的Java應(yīng)用中,將應(yīng)用的某些配置信息以XML文本文件的形式保存,并在需要的時(shí)候進(jìn)行還原是實(shí)現(xiàn)配置信息持久化的較為普遍而有效的做法。而在很多場(chǎng)合需要將多個(gè)毫無關(guān)聯(lián)的對(duì)象實(shí)例保存在同一個(gè)XML文本文件以減少配置文件的個(gè)數(shù)或者將一個(gè)對(duì)象實(shí)例保存在不同的文本文件中以控制配置文件的大小。由中國科學(xué)院計(jì)算機(jī)網(wǎng)絡(luò)信息中心開發(fā)的數(shù)據(jù)管理與共享平臺(tái),利用本發(fā)明的實(shí)施例將數(shù)據(jù)模型的配置信息按照類型存儲(chǔ)在不同的配置文件中,以控制配置文件的復(fù)雜度與大小。。目前,有部分企業(yè)應(yīng)用項(xiàng)目根據(jù)自身項(xiàng)目的需求,設(shè)計(jì)開發(fā)了Java對(duì)應(yīng)到Spring 配置文件格式的編組,但大多局限在特定需求以及特定前提,而無法滿足通用的Java對(duì)象編組需求。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種程序化生成Spring IOC配置文件的方法,以解決 Java對(duì)象實(shí)例編組為Spring IOC配置文件并被Spring框架正確解組的問題。為達(dá)到上述目的,本發(fā)明采用如下技術(shù)方案一種Spring IOC配置文件的生成方法,其步驟包括I)載入一個(gè)或多個(gè)Java對(duì)象實(shí)例,過濾并讀取欲編組的各Java對(duì)象實(shí)例的屬性列表;2)根據(jù)Spring IOC配置文件格式以及Java對(duì)象實(shí)例的屬性類型,創(chuàng)建對(duì)應(yīng)的節(jié)點(diǎn)創(chuàng)造器,并由其定義相應(yīng)類型節(jié)點(diǎn)的寫入規(guī)則;3)不同類型的節(jié)點(diǎn)創(chuàng)造器根據(jù)所述寫入規(guī)則生成不同的Spring IOC配置文件節(jié)點(diǎn),并將Java對(duì)象實(shí)例及其屬性寫入到所述Spring IOC配置文件節(jié)點(diǎn)中;4)按照用戶定義的輸出方式將所有節(jié)點(diǎn)輸出到Spring IOC配置文件。進(jìn)一步地,步驟I)通過Map屬性來存儲(chǔ)載入的一個(gè)或多個(gè)Java對(duì)象實(shí)例。進(jìn)一步地,步驟I)通過注解方式讀取并過濾所述Java對(duì)象實(shí)例的屬性。所述注解方式包括注解本身和注解的解析類,通過所述解析類讀取所有標(biāo)注的注解進(jìn)而得到需要編組的屬性列表。進(jìn)一步地,步驟3)所述屬性類型包括基本類型、對(duì)象類型、數(shù)組類型、List類型、 Map類型和Set類型。根據(jù)Spring IOC配置文件格式以及所述屬性類型,基于節(jié)點(diǎn)創(chuàng)造器接口創(chuàng)建所述節(jié)點(diǎn)創(chuàng)造器。進(jìn)一步地,根據(jù)對(duì)象格式化接口以及注冊(cè)類,將所有注冊(cè)過的Java對(duì)象實(shí)例格式化為文本字符串。
進(jìn)一步地,通過對(duì)象引用類型節(jié)點(diǎn)創(chuàng)造器以及對(duì)象實(shí)例與引用節(jié)點(diǎn)間的對(duì)應(yīng)關(guān)系實(shí)現(xiàn)多層次Java對(duì)象的相互引用。進(jìn)一步地,步驟5)所述用戶定義的輸出方式包括將不同的對(duì)象實(shí)例輸出到不同的XML文件,將互不關(guān)聯(lián)的多個(gè)對(duì)象實(shí)例輸出到同一個(gè)XML文件,以及將一個(gè)Java對(duì)象實(shí)例輸出到不同的XML文件。所述輸出方式通過綁定指定格式的節(jié)點(diǎn)到指定的輸出文件來實(shí)現(xiàn)。進(jìn)一步地,上述方法生成的Spring IOC配置文件可通過Spring框架進(jìn)行解組。與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)和積極效果如下I) Java對(duì)象實(shí)例間可以相互引用,且可以在Spring IOC配置文件實(shí)例中得到正確的表達(dá),并被Spring框架正確解組;2)編組后的Spring IOC配置文件實(shí)例可以充分利用Spring框架的其它功能,如聲明式事務(wù)支持、連接池等,豐富配置信息,簡化企業(yè)應(yīng)用的配置;3)實(shí)現(xiàn)不同的對(duì)象實(shí)現(xiàn)輸出到不同的XML文件、互不關(guān)聯(lián)的多個(gè)實(shí)例輸出到同一個(gè)XML文件以及一個(gè)對(duì)象實(shí)例輸出到不同的XML文件等多種需求;4)結(jié)合對(duì)象實(shí)例的屬性編輯器,支持對(duì)象實(shí)例的格式化(將對(duì)象實(shí)例以字符串形式來表達(dá));5)本發(fā)明在保證靈活性、編組效率以及功能需求的同時(shí),極大地簡化了配置工作, 方便用戶使用;6)本發(fā)明可以在以Spring框架為基礎(chǔ)的企業(yè)Java應(yīng)用與政府信息系統(tǒng)中得到應(yīng)用,利用本發(fā)明可以生成Spring IOC配置文件,進(jìn)而被Spring框架正確解析,實(shí)現(xiàn)Java對(duì)象與XML文件實(shí)例間的編組與解組。動(dòng)態(tài)生成的Spring IOC配置文件可以用來表達(dá)應(yīng)用系統(tǒng)配置信息、數(shù)據(jù)模型以及其它動(dòng)態(tài)變化的信息。
圖I為普通XML數(shù)據(jù)綁定的編組與解組示例圖。圖2為本發(fā)明實(shí)施例的Spring IOC配置文件的生成方法的流程圖。圖3為本發(fā)明實(shí)施例的通過編組上下文將Java對(duì)象實(shí)例寫入到Spring IOC配置文件的流程圖。圖4為本發(fā)明實(shí)施例對(duì)應(yīng)的編組與解組示例圖。
具體實(shí)施例方式下面通過實(shí)施例并結(jié)合附圖,對(duì)本發(fā)明做進(jìn)一步的說明。圖2為本實(shí)施例的程序化生成Spring IOC配置文件的方法的流程圖,其步驟包括I)設(shè)計(jì)并實(shí)現(xiàn)Java對(duì)象實(shí)例裝載機(jī)制,實(shí)現(xiàn)單個(gè)或者多個(gè)Java對(duì)象實(shí)例的裝載。在該步驟中,該Java對(duì)象實(shí)例裝載機(jī)制可以裝載需要編組的單個(gè)或多個(gè)Java對(duì)象實(shí)例列表。該機(jī)制體現(xiàn)為含有Map屬性的類,可以往Map屬性中添加一個(gè)或者多個(gè)Java 對(duì)象實(shí)例,具體在本實(shí)施例中體現(xiàn)為SpringBeans類。2)設(shè)計(jì)并實(shí)現(xiàn)屬性過濾機(jī)制,采用注解方式實(shí)現(xiàn)需要編組的Java對(duì)象的屬性過濾與讀取。在該步驟中,所述的機(jī)制包括注解本身和注解的解析類,由解析類讀取所有標(biāo)注的注解進(jìn)而得到需要編組的屬性列表;具體到本實(shí)施例中,通過設(shè)計(jì)OXmlProperty注解來標(biāo)識(shí)屬性(標(biāo)識(shí)屬性對(duì)應(yīng)的get方法),設(shè)計(jì)AnnotatedBeanWriterFormatFactory類來解析OXmlProperty注解進(jìn)而獲得需要編組到XML文件實(shí)例的屬性列表。3)設(shè)計(jì)并實(shí)現(xiàn)對(duì)象格式化機(jī)制,Java對(duì)象實(shí)例(或?qū)傩?格式化為文本字符串可以有效地隱藏對(duì)象實(shí)例(或?qū)傩?的內(nèi)部結(jié)構(gòu),減少XML文件實(shí)例的大小,并使XML文件實(shí)例的層次結(jié)構(gòu)更為清晰。在該步驟中,所述的機(jī)制包括值格式化接口(可以獲得格式化后的值)以及對(duì)象格式化注冊(cè)類,通過對(duì)象格式化注冊(cè)類,可以注冊(cè)所有需要格式化為文本字符串的對(duì)象實(shí)例與其格式化后的文本字符串之間的對(duì)應(yīng)關(guān)系;具體到本實(shí)施例中,通過設(shè)計(jì) ValueFormatter接口(具有g(shù)etAsTextO方法)獲得對(duì)象實(shí)例的格式化文本,通過對(duì)象實(shí)例格式化工廠(ValueFormaterRegistry類)注冊(cè)所有對(duì)象實(shí)例的格式化文本。4)根據(jù)Spring IOC配置文件格式以及Java對(duì)象實(shí)例的屬性類型,設(shè)計(jì)并實(shí)現(xiàn)節(jié)點(diǎn)創(chuàng)造器,并由其定義相應(yīng)類型節(jié)點(diǎn)的寫入規(guī)則。不同類型的節(jié)點(diǎn)創(chuàng)造器根據(jù)寫入規(guī)則生成不同的Spring IOC配置文件節(jié)點(diǎn),并將Java對(duì)象實(shí)例及其屬性寫入到Spring IOC配置文件節(jié)點(diǎn)中。在該步驟中,所述的屬性類型包括基本類型、對(duì)象類型、數(shù)組類型以及List、Map 和Set等集合類型,分別對(duì)應(yīng)基本類型節(jié)點(diǎn)創(chuàng)造器、對(duì)象類型節(jié)點(diǎn)創(chuàng)造器、數(shù)組節(jié)點(diǎn)創(chuàng)造器、List節(jié)點(diǎn)創(chuàng)造器、Map節(jié)點(diǎn)創(chuàng)造器和Set節(jié)點(diǎn)創(chuàng)造器。本實(shí)施例通過定義節(jié)點(diǎn)創(chuàng)造器接口(EntityNodeCreator)實(shí)現(xiàn)基本類型、對(duì)象類型、數(shù)組類型、List、Map以及Set等不同屬性類型的節(jié)點(diǎn)創(chuàng)造器,并由各節(jié)點(diǎn)創(chuàng)造器維護(hù)各屬性類型的寫入規(guī)則,進(jìn)而不同類型屬性節(jié)點(diǎn)的創(chuàng)建。5)設(shè)計(jì)并實(shí)現(xiàn)多文件輸出機(jī)制。該步驟可以實(shí)現(xiàn)按照用戶定義的輸出方式將所有節(jié)點(diǎn)輸出到Spring IOC配置文件;輸出方式包括將不同的對(duì)象實(shí)例輸出到不同的XML文件、互不關(guān)聯(lián)的多個(gè)實(shí)例輸出到同一個(gè)XML文件以及一個(gè)對(duì)象實(shí)例輸出到不同的XML文件等情況;本實(shí)施例利用FilteredOutput 接口的 getFilterO 方法和 getOutputStream() 方法綁定指定格式的節(jié)點(diǎn)到指定的輸出文件。在上述實(shí)施例中,進(jìn)一步可實(shí)現(xiàn)多層次對(duì)象屬性相互引用的寫入機(jī)制,該機(jī)制包括對(duì)象引用類型節(jié)點(diǎn)創(chuàng)造器以及對(duì)象實(shí)例與引用節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系維護(hù)表。通過對(duì)象引用類型節(jié)點(diǎn)創(chuàng)造器以及對(duì)象實(shí)例與引用節(jié)點(diǎn)間的對(duì)應(yīng)關(guān)系實(shí)現(xiàn)多層次Java對(duì)象的相互引用。在上述實(shí)施例中,進(jìn)一步可實(shí)現(xiàn)Java對(duì)象及其屬性的遍歷算法與編組上下文。所述的編組上下文通過遍歷對(duì)象實(shí)例及相應(yīng)的屬性列表,將其寫入到Spring IOC配置文件, 參考圖3,包括如下步驟a)獲得并遍歷對(duì)象實(shí)例列表;b)創(chuàng)建Spring配置文件格式的根節(jié)點(diǎn);該根節(jié)點(diǎn)符合Spring配置文件的Schema 規(guī)范。c)獲得對(duì)象實(shí)例的格式化文本;
d)分析對(duì)象實(shí)例類型,根據(jù)對(duì)象實(shí)例類型調(diào)用合適的節(jié)點(diǎn)創(chuàng)造器;e)如果實(shí)例為對(duì)象類型,分析實(shí)例的對(duì)應(yīng)節(jié)點(diǎn)是否已經(jīng)創(chuàng)建。如果已經(jīng)創(chuàng)建,則選擇對(duì)象引用節(jié)點(diǎn)創(chuàng)造器創(chuàng)建相應(yīng)的對(duì)象引用屬性;如果沒有創(chuàng)建,則選擇對(duì)象節(jié)點(diǎn)創(chuàng)造器創(chuàng)建對(duì)應(yīng)節(jié)點(diǎn),同時(shí)遍歷對(duì)象實(shí)例屬性列表,進(jìn)入到步驟d)。在該步驟中,通過維護(hù)所有Java對(duì)象實(shí)例及其引用節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系,實(shí)現(xiàn)多層次對(duì)象的相互引用。在編組過程中,將存在引用節(jié)點(diǎn)的對(duì)應(yīng)實(shí)例以頂層Bean節(jié)點(diǎn)的形式編組到Spring配置文件中,并分配唯一的ID,而其它引用關(guān)系則以ref的形式體現(xiàn)在各個(gè)屬性節(jié)點(diǎn)中。f)如果實(shí)例為非對(duì)象類型,則選擇基本類型節(jié)點(diǎn)創(chuàng)造器、數(shù)組節(jié)點(diǎn)創(chuàng)造器、Set節(jié)點(diǎn)創(chuàng)造器、Map節(jié)點(diǎn)創(chuàng)造器、List節(jié)點(diǎn)創(chuàng)造器等創(chuàng)建對(duì)應(yīng)的節(jié)點(diǎn)。對(duì)于數(shù)組、Set、Map以及List等類型來說,所述的數(shù)組節(jié)點(diǎn)創(chuàng)造器、Set節(jié)點(diǎn)創(chuàng)造器、Map節(jié)點(diǎn)創(chuàng)造器、List節(jié)點(diǎn)創(chuàng)造器等會(huì)首先創(chuàng)建對(duì)應(yīng)的〈array〉、〈set〉、〈map〉以及 〈list〉節(jié)點(diǎn),然后遍歷其元素列表,進(jìn)入到步驟d)。對(duì)于基本類型,節(jié)點(diǎn)創(chuàng)造器則直接根據(jù)實(shí)例對(duì)象的值創(chuàng)建節(jié)點(diǎn)。所有節(jié)點(diǎn)創(chuàng)造器維護(hù)各自類型節(jié)點(diǎn)的寫入規(guī)則,進(jìn)而實(shí)現(xiàn)不同類型對(duì)象實(shí)例值的正確編組。g)待所有遍歷完成后,遞歸調(diào)用節(jié)點(diǎn)的writeToO方法,將本節(jié)點(diǎn)寫入到父節(jié)點(diǎn) (根節(jié)點(diǎn)寫入到虛擬的父節(jié)點(diǎn));h)將所有對(duì)象實(shí)例以用戶設(shè)置的輸出方式編組到Spring配置文件實(shí)例中。該步驟生成的Spring IOC配置文件可以被Spring框架正確解組。圖4為本實(shí)施例對(duì)應(yīng)的編組與解組示例圖。下面結(jié)合圖4對(duì)本實(shí)施例的應(yīng)用所需要的配置作進(jìn)一步的說明。具體來說,本實(shí)施例表現(xiàn)為一個(gè)單獨(dú)的JAR包,同時(shí)依賴于 Dom4j的JAR包。在具體應(yīng)用時(shí),可以將本實(shí)施例對(duì)應(yīng)的JAR包以及相應(yīng)的依賴包導(dǎo)入到對(duì)應(yīng)的企業(yè)項(xiàng)目中,按照如下步驟即可完成Java對(duì)象實(shí)例到Spring配置文件實(shí)例的正確編組,生成的Spring配置文件可以被Spring框架正確解組。I)添加OXmlProperty注解,即為需要編組到XML文件的屬性添加OXmlProperty 注解,具體到本例中,即為Database類、Table類以及Field類相應(yīng)屬性的getXXX()方法添加 OXmlProperty 注解;2)實(shí)例化Database對(duì)象,并添加到需要編組的對(duì)象實(shí)例列表中。在本例中,實(shí)例化好的Database對(duì)象為database ;3)實(shí)例化Java對(duì)象裝載工具與編組工具,即實(shí)例化SpringBeans和 SpringBeansffriter ;4)設(shè)置編組工具的對(duì)象格式化方法,此步驟為可選步驟。如果沒有需要編組到字符串的Java對(duì)象實(shí)例,可不設(shè)置。5)設(shè)置編組工具的對(duì)象輸出策略,此步驟為可選步驟。如果不需要實(shí)現(xiàn)Java對(duì)應(yīng)實(shí)例的多文件輸出,則不需要設(shè)置。6)調(diào)用編組工具的write方法,輸出XML文件。根據(jù)上述步驟,本實(shí)施例在具體應(yīng)用中的核心代碼如下所示SpringBeans Writer sbw = new SpringBeansWriter();//實(shí)例化編組工具 SpringBeans beans = new SpringBeansQ;// 實(shí)例化 Java 對(duì)象裝載工具 beans.addBean(—database, "database”);//裝載 Java 對(duì)象實(shí)例
sbw.write(beans, new File(fdatabase.xmVf));// 輸出到XML 文件實(shí)例中如果需要設(shè)置編組工具的對(duì)象格式化方法,代碼如下所示
II對(duì)象實(shí)例格式化,將對(duì)象實(shí)例以字符串的形式編組到XML文件中 //通過設(shè)置SpringBeansWriter的對(duì)象實(shí)例格式化工廠,實(shí)現(xiàn)對(duì)象實(shí)例的格式化 ValueFormaterRegistry titlePropertyFormater = new ValueFormaterRegistryQ; titleP roper tyFormater. register ValueFormater (Field, class, new Value Format er ()
{
public String ge tAsText(Object raw Value)
{
Field obj = (Field) raw Value;
return f,id:n + obj.getId() + n;length:” + obj.getLength() + n;defaultValue:n + obj.getDefaultValue() +
”;nullValue:” + obj. isNullValueQ;
示
sbw. setPropertyStringifierFactory(titlePropertyFormater);
在設(shè)置對(duì)象實(shí)例格式化策略前后,F(xiàn)ield對(duì)象在XML文件實(shí)例中表現(xiàn)形式如下所
Il設(shè)置對(duì)象格式化策略前 <bean class="cn.csdb.commons.vo.Field”〉 〈property name-tIdn value=” l”/>
〈property name=nIengthn value=" 40"/>
〈property name="defaultValue,f value=n,,/>
〈property Yiame=nTiuUValuen value=,’false,,/〉
</bean>
Il設(shè)置對(duì)象格式化策略后 id: I; length :40; default Value: ;null Value '.false
如果需要設(shè)置編組工具的對(duì)象輸出策略,代碼如下所示
List<FilteredOutpuf> outputs = new ArrayList<FilteredOutput> (); outputs.add(new SimpleFilteredOutput(newMatcher<EntityNode< >>()
{
public boolean matches(EntityNode< > toMatch)
{
Object nodeValue = toMatch ge t Value (); return node Value instanceof Table;
}
},new File(’tabIes.xml,’)));
outputs. add(new SimpleFilteredOutput(new File(丨,database.χπιΓ))); sbw.write (beans, outputs);以上所述僅為本發(fā)明的較佳實(shí)施例,凡根據(jù)本發(fā)明權(quán)利要求所做的同等變化與修改,都應(yīng)屬于本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種Spring IOC配置文件的生成方法,其步驟包括1)載入一個(gè)或多個(gè)Java對(duì)象實(shí)例,過濾并讀取欲編組的各Java對(duì)象實(shí)例的屬性列表;2)根據(jù)SpringIOC配置文件格式以及Java對(duì)象實(shí)例的屬性類型,創(chuàng)建對(duì)應(yīng)的節(jié)點(diǎn)創(chuàng)造器,并由其定義相應(yīng)類型節(jié)點(diǎn)的寫入規(guī)則;3)不同類型的節(jié)點(diǎn)創(chuàng)造器根據(jù)所述寫入規(guī)則生成不同的SpringIOC配置文件節(jié)點(diǎn), 并將Java對(duì)象實(shí)例及其屬性寫入該節(jié)點(diǎn)中;4)按照用戶定義的輸出方式將所有節(jié)點(diǎn)輸出到SpringIOC配置文件。
2.如權(quán)利要求I所述的方法,其特征在于,通過Map屬性來存儲(chǔ)載入的一個(gè)或多個(gè) Java對(duì)象實(shí)例。
3.如權(quán)利要求I所述的方法,其特征在于,通過注解方式過濾并讀取所述Java對(duì)象實(shí)例的屬性。
4.如權(quán)利要求3所述的方法,其特征在于,所述注解方式包括注解本身和注解的解析類,通過所述解析類讀取所有標(biāo)注的注解進(jìn)而得到需要編組的屬性列表。
5.如權(quán)利要求I所述的方法,其特征在于所述屬性類型包括基本類型、對(duì)象類型、數(shù)組類型、Li st類型、Map類型和Set類型。
6.如權(quán)利要求I所述的方法,其特征在于,根據(jù)對(duì)象格式化接口以及注冊(cè)類,將所有注冊(cè)過的Java對(duì)象實(shí)例格式化為文本字符串。
7.如權(quán)利要求I所述的方法,其特征在于,通過對(duì)象引用類型節(jié)點(diǎn)創(chuàng)造器以及對(duì)象實(shí)例與引用節(jié)點(diǎn)間的對(duì)應(yīng)關(guān)系實(shí)現(xiàn)多層次Java對(duì)象的相互引用。
8.如權(quán)利要求I所述的方法,其特征在于,所述輸出方式包括將不同的對(duì)象實(shí)例輸出到不同的XML文件,將互不關(guān)聯(lián)的多個(gè)對(duì)象實(shí)例輸出到同一個(gè)XML文件,以及將一個(gè)Java 對(duì)象實(shí)例輸出到不同的XML文件。
9.如權(quán)利要求8所述的方法,其特征在于,所述輸出方式通過綁定指定格式的節(jié)點(diǎn)到指定的輸出文件來實(shí)現(xiàn)。
10.如權(quán)利要求I至9任一項(xiàng)所述的方法,其特征在于,生成的SpringIOC配置文件通過Spring框架進(jìn)行解組。
全文摘要
本發(fā)明提供一種Spring IOC配置文件的生成方法,其步驟包括1)載入一個(gè)或多個(gè)Java對(duì)象實(shí)例,讀取并過濾欲編組的各Java對(duì)象實(shí)例的屬性列表;2)創(chuàng)建對(duì)應(yīng)的節(jié)點(diǎn)創(chuàng)造器,并定義寫入規(guī)則;3)節(jié)點(diǎn)創(chuàng)造器根據(jù)寫入規(guī)則生成Spring IOC配置文件節(jié)點(diǎn),并在該節(jié)點(diǎn)中寫入Java對(duì)象實(shí)例及其屬性;4)按照不同輸出方式將所有節(jié)點(diǎn)輸出到Spring IOC配置文件。本發(fā)明方法的Java對(duì)象實(shí)例間可以相互引用,生成的Spring IOC配置文件可被Spring框架正確解組;靈活性和編組效率高,可極大地簡化配置工作,方便用戶使用。
文檔編號(hào)G06F9/44GK102609255SQ20121001812
公開日2012年7月25日 申請(qǐng)日期2012年1月19日 優(yōu)先權(quán)日2012年1月19日
發(fā)明者沈志宏, 蘇賢明, 黎建輝 申請(qǐng)人:中國科學(xué)院計(jì)算機(jī)網(wǎng)絡(luò)信息中心