Spring高級應用之注入各類集合
先定義一個測試類,由于本文將要介紹注入各種集合時如何配置,故這個類包含各種集合,類名和屬性名不好取,沒有特殊含義:
1 public class Test { 2 private List<String> listTest; 3 private Map<String, Object> mapTest; 4 private Set setTest; 5 private String[] arrayTest; 6 private Properties propertiesTest; 7 //下面是各個屬性的setter,此處省略 8 //...... 9 }
Test類中,分別定義了List,Map,Set,Array等5種集合類型的屬性,下面在Spring配置文件中,分別為這些類型的屬性注入值:
1 < bean id = "test" class = "com.abc.Test" > 2 <!-- List類型的屬性 --> 3 < property name = "listTest" > 4 <!-- 為list類型的屬性注入值時,使用<list>元素 --> 5 < list > 6 <!-- 只要類型滿足,每個<value>,<ref>,<bean>都可以配置一個list的元素 --> 7 < value >ListA</ value > 8 < value >ListB</ value > 9 < value >ListC</ value > 10 </ list > 11 </ property > 12 13 <!-- Map類型的屬性 --> 14 < property name = "mapTest" > 15 <!-- 為map類型的屬性注入值時,使用<map>元素 --> 16 < map > 17 <!-- 每一個<entry>都為<map>配置一個K-V對,同樣, --> 18 < entry key = "key1" value = "value1" /> 19 <!-- 下面這個value指向了在此Spring文件中定義的另一個叫object的Bean --> 20 < entry key = "key2" value-ref = "object" /> 21 </ map > 22 </ property > 23 24 <!-- Set類型的屬性 --> 25 < property name = "setTest" > 26 <!-- 為set類型的屬性注入值時,使用<set>元素 --> 27 < set > 28 <!-- 只要類型滿足,每個<value>,<ref>,<bean>都可以配置一個list的元素 --> 29 < value >SetA</ value > 30 <!-- 下面是一個嵌套Bean的定義。關(guān)于什么是嵌套Bean,請看:http://my.oschina.net/itblog/blog/204378 --> 31 < bean class = "com.abc.OtherBean1" /> 32 <!-- 下面引用了此Spring文件中定義的另一個Bean --> 33 < ref local = "com.abc.OtherBean2" /> 34 </ set > 35 </ property > 36 37 <!-- Properties類型的屬性 --> 38 < property name = "propertiesTest" > 39 < props > 40 <!-- 每個<prop>元素指定一個屬性項,其中key指定屬性名 --> 41 < prop key = "prop1" >value1</ prop > 42 < prop key = "prop2" >value2</ prop > 43 </ props > 44 </ property > 45 46 <!-- 數(shù)組類型的屬性 --> 47 < property name = "arrayTest" > 48 <!-- 為數(shù)組類型的屬性注入值時,使用<array>元素 --> 49 < array > 50 <!-- 只要類型滿足,每個<value>,<ref>,<bean>都可以配置一個list的元素 --> 51 < value >Array1</ value > 52 < bean class = "com.abc.OtherBean1" /> 53 < ref local = "com.abc.OtherBean2" /> 54 </ array > 55 </ property > 56 </ bean >
由于集合元素有可以是基本類型值、引用容器中其他Bean、嵌套Bean或集合屬性等,因此<list>、<set>、和<key>元素又可以接受如下的子元素:
-
value:指定集合元素是基本數(shù)據(jù)類型值或字符串類型值
-
ref:指定集合元素是容器中另一個Bean實例
-
bean:指定集合元素是一個嵌套Bean
-
list、set、map及props:指定集合元素值又是集合
<props>元素適用于配置Properties類型的屬性,Properties類型時一種特殊的類型,其key和value都只能是字符串,故Spring配置Properties類型的屬性都比較簡單:每個屬性項只要分別給出屬性名和屬性值就足夠了。
當使用<map>元素配置Map類型屬性時稍顯復雜,因為Map類型的元素由多個<entry>組成,每個<entry>又需要配置key和value兩個屬性。其中<entry>屬性支持以下幾個屬性:
-
key:當key是基本類型或字符串時使用
-
key-ref:當key類型是容器中定義的另一個Bean時使用
-
value:當value是基本類型或字符串時使用
-
value-ref:當value是容器中定義的另一個Bean時使用
Spring還提供了一個簡化語法來支持Properties形參的setter方法,例如我們可以使用如下配置片段來配置Properties類型的屬性:
1 < property name = "propertiesTest" > 2 < value > 3 key1=value1 4 key2=value2 5 </ value > 6 </ property >
雖然這種配置方式更簡單,但是它也有一個缺點:屬性名、屬性值都只能是英文或數(shù)字,不能包含中文字符
從Spring2開始,Spring IoC容器支持集合的合并:子Bean中的集合屬性可以從其父Bean的集合屬性繼承而來,同時,子Bean中的屬性會覆蓋父Bean中屬性名相同的值。也就是說,子Bean的集合屬性的最終值是父Bean、子Bean合并后的最終結(jié)果,下面是一個示例:
1 <!-- 將parent類型定義成抽象類 --> 2 < bean id = "parent" abstract = "true" class = "com.abc.Parent" > 3 <!-- 定義Properties類型的集合屬性 --> 4 < property name = "websites" > 5 < props > 6 < prop key = "baidu" >www.baidu.com</ props > 7 < prop key = "google" >www.google.com.hk</ prop > 8 < props > 9 </ property > 10 </ bean > 11 < bean id = "child" parent = "parent" > 12 < property name = "websites" > 13 <!-- 注意,這里子Bean在集合元素上加了屬性"merge=true" --> 14 < props merge = "true" > 15 < prop key = "google" >www.google.com</ prop > 16 < prop key = "tencent" >www.qq.com</ prop > 17 < props > 18 </ property > 19 </ bean >
通過上面的配置后,child中的屬性將變?yōu)椋?/p>
1 baidu=www.baidu.com 2 google=www.google.com 3 tencent=www.qq.com

浙公網(wǎng)安備 33010602011771號