?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
為了與Spring提供的其他重要概念的抽象相一致,Spring為元數(shù)據(jù)實(shí)現(xiàn)提供了一個(gè)門面(facade),
它是以org.springframework.metadata.Attributes
接口的形式來實(shí)現(xiàn)。
這個(gè)門面因以下幾個(gè)原因而顯得很有價(jià)值:
盡管Java 5提供了語言級(jí)的元數(shù)據(jù)支持,但提供這樣一個(gè)抽象仍具價(jià)值:
Java 5的元數(shù)據(jù)是靜態(tài)的。它是在編譯時(shí)與一個(gè)類關(guān)聯(lián),而且在部署環(huán)境下是不可改變的 (注解的狀態(tài)可以通過反射在運(yùn)行時(shí)改變,但這并不是一個(gè)很好的實(shí)踐)。 這里會(huì)需要多層次的元數(shù)據(jù), 以支持在部署時(shí)重載某些屬性的值 - 舉例來說,在一個(gè)XML文件中定義用于覆蓋的屬性。
Java 5的元數(shù)據(jù)是通過Java反射API返回的。這使得在測(cè)試時(shí)無法模擬元數(shù)據(jù)。 Spring提供了一個(gè)簡(jiǎn)單的接口來允許這種模擬。
在未來至少兩年內(nèi)仍有在1.3和1.4應(yīng)用程序中支持元數(shù)據(jù)的需要。Spring著眼于提供現(xiàn)在可以工作的解決方案; 在這個(gè)重要領(lǐng)域中強(qiáng)迫使用Java 5并不是一個(gè)明智之舉。
當(dāng)前的元數(shù)據(jù)API,例如Commons Attributes(在Spring 1.0-1.2中使用)很難測(cè)試。Spring提供了一個(gè)簡(jiǎn)單的易于模擬的元數(shù)據(jù)接口。
Spring的Attributes
接口是這個(gè)樣子的:
public interface Attributes { Collection getAttributes(Class targetClass); Collection getAttributes(Class targetClass, Class filter); Collection getAttributes(Method targetMethod); Collection getAttributes(Method targetMethod, Class filter); Collection getAttributes(Field targetField); Collection getAttributes(Field targetField, Class filter); }
這是個(gè)極其普通的接口。JSR-175提供了比這更多的功能,比如定義在方法參數(shù)上的屬性。
要注意到該接口像.NET一樣提供了Object
屬性。這使得它區(qū)別于一些僅提供String
屬性的元數(shù)據(jù)屬性系統(tǒng),
比如Nanning Aspects。支持Object
屬性有一個(gè)顯著的優(yōu)點(diǎn)。它使屬性能參與到類層次中,
還可以使屬性能夠靈活的根據(jù)它們的配置參數(shù)起作用。
對(duì)于大多數(shù)屬性提供者來說,屬性類的配置是通過構(gòu)造方法參數(shù)或JavaBean的屬性完成的。Commons Attributes同時(shí)支持這兩種方式。
同所有的Spring抽象API一樣,Attributes
是一個(gè)接口。這使得在單元測(cè)試中模擬屬性的實(shí)現(xiàn)變得容易起來。