為了與它提供的其他重要概念的抽象相一致Spring提供了一個對元數據實現的外觀(facade) 以orgtadataAttributes這個接口的形式來表示
這樣一個外觀很有價值因為下面幾個原因
目前還沒有一個標准的元數據解決方案 Java 版本會提供一個但是在Spring版本的時候 Java 仍是beta版本而且至少兩年內還是需要對和版本的應用程序提供元數據支持 現在Spring打算提供一些可以工作的解決方案 在一個重要的環境下等待並不是個好的選擇
目前的元數據API例如Commons Attributes(被Spring 使用) 測試起來很困難Spring提供了一個簡單的更容易模擬的元數據接口
即使當Java 在語言級別提供了對元數據的支持時提供了一個如此的抽象仍然是有價值的:
JSR的元數據是靜態的它是在編譯時與某一個類關聯而在部署環境下是不可改變的 這裡會需要多層次的元數據以支持在部署時重載某些attribute的值--舉例來說 在一個XML文件中定義用於覆蓋的attribute
JSR的元數據是通過Java反射API返回的這使得在測試時無法模擬元數據Spring提供了一個簡單的接口來允許這種模擬
雖然Spring在Java 達到它的GA版本之前將支持JSR但仍會繼續提供一個attribute抽象API
Spring的Attributes接口看起來是這樣的
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);
}
這是個最普通不過的命名者接口JSR能提供更多的功能比如定義在方法參數上的attributes 在版本時Spring目的在於提供元數據的一個子集使得能象EJB或NET一樣提供有效的聲明式企業級服務版本以後Spring將提供更多的元數據方法
注意到該接口像NET一樣提供了Object類型的attibute 這使得它區別於一些僅提供String類的attribute的attribute系統 比如Nanning Aspects和JBoss (在DR版本時)支持Object類型的attribute有一個顯著的優點它使attribute含有類層次還可以使attribute能夠靈活的根據它們的配置參數起作用
對於大多數attribute提供者來說attribute類的配置是通過構造函數參數或JavaBean的屬性完成的Commons Attributes同時支持這兩種方式
同所有的Spring抽象API一樣Attributes是一個接口這使得在單元測試中模擬attribute的實現變得容易起來
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28869.html