?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
雖然為其他元數(shù)據(jù)提供者提供org.springframework.metadata.Attributes
接口的實(shí)現(xiàn)很簡單,但是目前Spring只支持Jakarta Commons Attributes。
Commons Attributes 2.2(http://jakarta.apache.org/commons/attributes/)是一個(gè)功能很強(qiáng)的元數(shù)據(jù)屬性解決方案。 它支持通過構(gòu)造方法參數(shù)和JavaBean屬性來配置屬性,這為屬性定義提供了更好的自說明文檔。 (對JavaBean屬性的支持是在Spring小組的要求下添加的。)
我們已經(jīng)看到了兩個(gè)Commons Attributes的屬性定義的例子。讓我們大體上解釋一下:
屬性類的名稱。這可能是一個(gè)全限定名稱(fully qualified name, FQN), 就像上面的那樣。如果相關(guān)的屬性類已經(jīng)被導(dǎo)入,就不需要FQN了。你也可以在屬性編譯器的設(shè)置中指定屬性的包名。
任何必須的參數(shù)化。可以通過構(gòu)造方法參數(shù)或者JavaBean屬性完成。
Bean的屬性可以是這樣的:
可以把構(gòu)造方法參數(shù)和JavaBean屬性結(jié)合在一起(就像在Spring IoC中一樣)。
由于Common Attributes沒有像Java 1.5中的屬性那樣和Java語言本身結(jié)合起來, 因此需要運(yùn)行一個(gè)特定的屬性編譯步驟作為整個(gè)構(gòu)建過程的一部分。
為了在整個(gè)構(gòu)建過程中運(yùn)行Commmons Attributes,你需要做以下的事情:
1. 復(fù)制一些必要的jar包到$ANT_HOME/lib
。有四個(gè)必須的jar包,它們包含在Spring的發(fā)行包里:
Commons Attributes編譯器jar和API jar
XDoclet中的xJavadoc.jar
Jakarta Commons中的commons-collections.jar
2. 把Commons Attributes的ant任務(wù)導(dǎo)入到你的項(xiàng)目構(gòu)建腳本中去,像下面這樣:
<taskdef resource="org/apache/commons/attributes/anttasks.properties"/>
3. 接下來,定義一個(gè)屬性編譯任務(wù),它將使用Commons Attributes的attribute-compiler任務(wù)來“編譯”源代碼中的屬性。
這個(gè)過程將生成額外的代碼至destdir
屬性指定的位置。在這里我們使用了一個(gè)臨時(shí)目錄來保存生成的文件:
<target name="compileAttributes"> <attribute-compiler destdir="${commons.attributes.tempdir}"> <fileset dir="${src.dir}" includes="**/*.java"/> </attribute-compiler> </target>
運(yùn)行javac命令編譯源代碼的編譯目標(biāo)任務(wù)應(yīng)該依賴于屬性編譯任務(wù),還需要編譯屬性時(shí)生成至目標(biāo)臨時(shí)目錄的源代碼。 如果在屬性定義中有語法錯(cuò)誤,通常都會被屬性編譯器捕獲到。但是,如果屬性定義在語法上似是而非,卻使用了一些非法的類型或類名, 生成屬性類的編譯可能會失敗。在這種情況下,你可以看看所生成的類來確定錯(cuò)誤的原因。
Commons Attributes也提供對Maven的支持。請參考Commons Attributes的文檔得到進(jìn)一步的信息。
雖然屬性編譯的過程可能看起來復(fù)雜,實(shí)際上它是一次性的花銷。一旦被創(chuàng)建后,屬性的編譯是遞增式的,所以通常它不會明顯減慢整個(gè)構(gòu)建過程。 一旦編譯過程建立起來后,你可能會發(fā)現(xiàn)本章中描述的屬性的使用將節(jié)省在其他方面的時(shí)間。
如果需要屬性索引支持(目前只在Spring的以屬性為目標(biāo)的web控制器中需要,下面會討論到),你需要在包含編譯后的類的jar文件上執(zhí)行一個(gè)額外的步驟。 在這步可選的步驟中,Commons Attributes將為你在源代碼中定義的所有屬性創(chuàng)建一個(gè)索引,以便在運(yùn)行時(shí)進(jìn)行有效的查找。 該步驟如下:
<attribute-indexer jarFile="myCompiledSources.jar"> <classpath refid="master-classpath"/> </attribute-indexer>
可以到Spring jPetStore例程下的/attributes
目錄下察看它的構(gòu)建過程。
你可以使用它里面的構(gòu)建腳本,并修改該腳本以適應(yīng)你自己的項(xiàng)目。
如果你的單元測試依賴于屬性,盡量使它依賴于Spring Attributes抽象,而不是Commons Attributes。原因有兩點(diǎn), 其一是為了更好的移植性 - 舉例來說,你的測試用例將來仍可以工作如果你轉(zhuǎn)換至Java 1.5的屬性 - 它簡化了測試。 其次,Commons Attributes是靜態(tài)的API,而Spring提供的是一個(gè)容易模擬的元數(shù)據(jù)接口。