先定義一個測試類,由于本文将要介紹注入各種集合時如何配置,故這個類包含各種集合,類名和屬性名不好取,沒有特殊含義:
<a href="http://my.oschina.net/itblog/blog/204383#">?</a>
1
2
3
4
5
6
7
8
9
<code>public</code> <code>class</code> <code>test {</code>
<code> </code><code>private</code> <code>list<string> listtest;</code>
<code> </code><code>private</code> <code>map<string, object> maptest;</code>
<code> </code><code>private</code> <code>set settest;</code>
<code> </code><code>private</code> <code>string[] arraytest;</code>
<code> </code><code>private</code> <code>properties propertiestest;</code>
<code> </code><code>//下面是各個屬性的setter,此處省略</code>
<code> </code><code>//......</code>
<code>}</code>
test類中,分别定義了list,map,set,array等5種集合類型的屬性,下面在spring配置檔案中,分别為這些類型的屬性注入值:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"test"</code> <code>class</code><code>=</code><code>"com.abc.test"</code><code>></code>
<code> </code><code><!-- list類型的屬性 --></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"listtest"</code><code>></code>
<code> </code><code><!-- 為list類型的屬性注入值時,使用<list>元素 --></code>
<code> </code><code><</code><code>list</code><code>></code>
<code> </code><code><!-- 隻要類型滿足,每個<value>,<ref>,<bean>都可以配置一個list的元素 --></code>
<code> </code><code><</code><code>value</code><code>>lista</</code><code>value</code><code>></code>
<code> </code><code><</code><code>value</code><code>>listb</</code><code>value</code><code>></code>
<code> </code><code><</code><code>value</code><code>>listc</</code><code>value</code><code>></code>
<code> </code><code></</code><code>list</code><code>></code>
<code> </code><code></</code><code>property</code><code>></code>
<code> </code>
<code> </code><code><!-- map類型的屬性 --></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"maptest"</code><code>></code>
<code> </code><code><!-- 為map類型的屬性注入值時,使用<map>元素 --></code>
<code> </code><code><</code><code>map</code><code>></code>
<code> </code><code><!-- 每一個<entry>都為<map>配置一個k-v對,同樣, --></code>
<code> </code><code><</code><code>entry</code> <code>key</code><code>=</code><code>"key1"</code> <code>value</code><code>=</code><code>"value1"</code> <code>/></code>
<code> </code><code><!-- 下面這個value指向了在此spring檔案中定義的另一個叫object的bean --></code>
<code> </code><code><</code><code>entry</code> <code>key</code><code>=</code><code>"key2"</code> <code>value-ref</code><code>=</code><code>"object"</code> <code>/></code>
<code> </code><code></</code><code>map</code><code>></code>
<code> </code><code><!-- set類型的屬性 --></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"settest"</code><code>></code>
<code> </code><code><!-- 為set類型的屬性注入值時,使用<set>元素 --></code>
<code> </code><code><</code><code>set</code><code>></code>
<code> </code><code><</code><code>value</code><code>>seta</</code><code>value</code><code>></code>
<code> </code><code><!-- 下面是一個嵌套bean的定義。關于什麼是嵌套bean,請看:http://my.oschina.net/itblog/blog/204378 --></code>
<code> </code><code><</code><code>bean</code> <code>class</code><code>=</code><code>"com.abc.otherbean1"</code> <code>/></code>
<code> </code><code><!-- 下面引用了此spring檔案中定義的另一個bean --></code>
<code> </code><code><</code><code>ref</code> <code>local</code><code>=</code><code>"com.abc.otherbean2"</code> <code>/></code>
<code> </code><code></</code><code>set</code><code>></code>
<code> </code><code><!-- properties類型的屬性 --></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"propertiestest"</code><code>></code>
<code> </code><code><</code><code>props</code><code>></code>
<code> </code><code><!-- 每個<prop>元素指定一個屬性項,其中key指定屬性名 --></code>
<code> </code><code><</code><code>prop</code> <code>key</code><code>=</code><code>"prop1"</code><code>>value1</</code><code>prop</code><code>></code>
<code> </code><code><</code><code>prop</code> <code>key</code><code>=</code><code>"prop2"</code><code>>value2</</code><code>prop</code><code>></code>
<code> </code><code></</code><code>props</code><code>></code>
<code> </code><code><!-- 數組類型的屬性 --></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"arraytest"</code><code>></code>
<code> </code><code><!-- 為數組類型的屬性注入值時,使用<list>元素 --></code>
<code> </code><code><</code><code>value</code><code>>array1</</code><code>value</code><code>></code>
<code></</code><code>bean</code><code>></code>
由于集合元素有可以是基本類型值、引用容器中其他bean、嵌套bean或集合屬性等,是以<list>、<set>、和<key>元素又可以接受如下的子元素:
value:指定集合元素是基本資料類型值或字元串類型值
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類型的屬性:
<code><</code><code>property</code> <code>name</code><code>=</code><code>"propertiestest"</code><code>></code>
<code> </code><code><</code><code>value</code><code>></code>
<code> </code><code>key1=value1</code>
<code> </code><code>key2=value2</code>
<code> </code><code></</code><code>value</code><code>></code>
<code></</code><code>property</code><code>></code>
雖然這種配置方式更簡單,但是它也有一個缺點:屬性名、屬性值都隻能是英文或數字,不能包含中文字元
從spring2開始,spring ioc容器支援集合的合并:子bean中的集合屬性可以從其父bean的集合屬性繼承而來,同時,子bean中的屬性會覆寫父bean中屬性名相同的值。也就是說,子bean的集合屬性的最終值是父bean、子bean合并後的最終結果,下面是一個示例:
<code><!-- 将parent類型定義成抽象類 --></code>
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"parent"</code> <code>abstract</code><code>=</code><code>"true"</code> <code>class</code><code>=</code><code>"com.abc.parent"</code><code>></code>
<code> </code><code><!-- 定義properties類型的集合屬性 --></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"websites"</code><code>></code>
<code> </code><code><</code><code>prop</code> <code>key</code><code>=</code><code>"baidu"</code><code>>www.baidu.com</</code><code>props</code><code>></code>
<code> </code><code><</code><code>prop</code> <code>key</code><code>=</code><code>"google"</code><code>>www.google.com.hk</</code><code>prop</code><code>></code>
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"child"</code> <code>parent</code><code>=</code><code>"parent"</code><code>></code>
<code> </code><code><!-- 注意,這裡子bean在集合元素上加了屬性"merge=true" --></code>
<code> </code><code><</code><code>props</code> <code>merge</code><code>=</code><code>"true"</code><code>></code>
<code> </code><code><</code><code>prop</code> <code>key</code><code>=</code><code>"google"</code><code>>www.google.com</</code><code>prop</code><code>></code>
<code> </code><code><</code><code>prop</code> <code>key</code><code>=</code><code>"tencent"</code><code>>www.qq.com</</code><code>prop</code><code>></code>
<code> </code><code></</code><code>property</code><code>> </code>
通過上面的配置後,child中的屬性将變為:
<code>baidu=www.baidu.com</code>
<code>google=www.google.com</code>
<code>tencent=www.qq.com</code>