天天看點

Spring進階應用之注入各類集合

    先定義一個測試類,由于本文将要介紹注入各種集合時如何配置,故這個類包含各種集合,類名和屬性名不好取,沒有特殊含義:

<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&lt;string&gt; listtest;</code>

<code>    </code><code>private</code> <code>map&lt;string, object&gt; 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>&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"test"</code> <code>class</code><code>=</code><code>"com.abc.test"</code><code>&gt;</code>

<code>    </code><code>&lt;!-- list類型的屬性 --&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"listtest"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 為list類型的屬性注入值時,使用&lt;list&gt;元素 --&gt;</code>

<code>        </code><code>&lt;</code><code>list</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 隻要類型滿足,每個&lt;value&gt;,&lt;ref&gt;,&lt;bean&gt;都可以配置一個list的元素 --&gt;</code>

<code>            </code><code>&lt;</code><code>value</code><code>&gt;lista&lt;/</code><code>value</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>value</code><code>&gt;listb&lt;/</code><code>value</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>value</code><code>&gt;listc&lt;/</code><code>value</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>list</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>property</code><code>&gt;</code>

<code>    </code> 

<code>    </code><code>&lt;!-- map類型的屬性 --&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"maptest"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 為map類型的屬性注入值時,使用&lt;map&gt;元素 --&gt;</code>

<code>        </code><code>&lt;</code><code>map</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 每一個&lt;entry&gt;都為&lt;map&gt;配置一個k-v對,同樣, --&gt;</code>

<code>            </code><code>&lt;</code><code>entry</code> <code>key</code><code>=</code><code>"key1"</code> <code>value</code><code>=</code><code>"value1"</code> <code>/&gt;</code>

<code>            </code><code>&lt;!-- 下面這個value指向了在此spring檔案中定義的另一個叫object的bean --&gt;</code>

<code>            </code><code>&lt;</code><code>entry</code> <code>key</code><code>=</code><code>"key2"</code> <code>value-ref</code><code>=</code><code>"object"</code> <code>/&gt;</code>

<code>        </code><code>&lt;/</code><code>map</code><code>&gt;</code>

<code>    </code><code>&lt;!-- set類型的屬性 --&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"settest"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 為set類型的屬性注入值時,使用&lt;set&gt;元素 --&gt;</code>

<code>        </code><code>&lt;</code><code>set</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>value</code><code>&gt;seta&lt;/</code><code>value</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 下面是一個嵌套bean的定義。關于什麼是嵌套bean,請看:http://my.oschina.net/itblog/blog/204378 --&gt;</code>

<code>            </code><code>&lt;</code><code>bean</code> <code>class</code><code>=</code><code>"com.abc.otherbean1"</code> <code>/&gt;</code>

<code>            </code><code>&lt;!-- 下面引用了此spring檔案中定義的另一個bean --&gt;</code>

<code>            </code><code>&lt;</code><code>ref</code> <code>local</code><code>=</code><code>"com.abc.otherbean2"</code> <code>/&gt;</code>

<code>        </code><code>&lt;/</code><code>set</code><code>&gt;</code>

<code>    </code><code>&lt;!-- properties類型的屬性 --&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"propertiestest"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>props</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 每個&lt;prop&gt;元素指定一個屬性項,其中key指定屬性名 --&gt;</code>

<code>            </code><code>&lt;</code><code>prop</code> <code>key</code><code>=</code><code>"prop1"</code><code>&gt;value1&lt;/</code><code>prop</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>prop</code> <code>key</code><code>=</code><code>"prop2"</code><code>&gt;value2&lt;/</code><code>prop</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>props</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 數組類型的屬性 --&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"arraytest"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 為數組類型的屬性注入值時,使用&lt;list&gt;元素 --&gt;</code>

<code>            </code><code>&lt;</code><code>value</code><code>&gt;array1&lt;/</code><code>value</code><code>&gt;</code>

<code>&lt;/</code><code>bean</code><code>&gt;</code>

    由于集合元素有可以是基本類型值、引用容器中其他bean、嵌套bean或集合屬性等,是以&lt;list&gt;、&lt;set&gt;、和&lt;key&gt;元素又可以接受如下的子元素:

value:指定集合元素是基本資料類型值或字元串類型值

ref:指定集合元素是容器中另一個bean執行個體

bean:指定集合元素是一個嵌套bean

list、set、map及props:指定集合元素值又是集合

    &lt;props&gt;元素适用于配置properties類型的屬性,properties類型時一種特殊的類型,其key和value都隻能是字元串,故spring配置properties類型的屬性都比較簡單:每個屬性項隻要分别給出屬性名和屬性值就足夠了。

    當使用&lt;map&gt;元素配置map類型屬性時稍顯複雜,因為map類型的元素由多個&lt;entry&gt;組成,每個&lt;entry&gt;又需要配置key和value兩個屬性。其中&lt;entry&gt;屬性支援以下幾個屬性:

key:當key是基本類型或字元串時使用

key-ref:當key類型是容器中定義的另一個bean時使用

value:當value是基本類型或字元串時使用

value-ref:當value是容器中定義的另一個bean時使用

    spring還提供了一個簡化文法來支援properties形參的setter方法,例如我們可以使用如下配置片段來配置properties類型的屬性:

<code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"propertiestest"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>value</code><code>&gt;</code>

<code>        </code><code>key1=value1</code>

<code>        </code><code>key2=value2</code>

<code>    </code><code>&lt;/</code><code>value</code><code>&gt;</code>

<code>&lt;/</code><code>property</code><code>&gt;</code>

    雖然這種配置方式更簡單,但是它也有一個缺點:屬性名、屬性值都隻能是英文或數字,不能包含中文字元

    從spring2開始,spring ioc容器支援集合的合并:子bean中的集合屬性可以從其父bean的集合屬性繼承而來,同時,子bean中的屬性會覆寫父bean中屬性名相同的值。也就是說,子bean的集合屬性的最終值是父bean、子bean合并後的最終結果,下面是一個示例:

<code>&lt;!-- 将parent類型定義成抽象類 --&gt;</code>

<code>&lt;</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>&gt;</code>

<code>    </code><code>&lt;!-- 定義properties類型的集合屬性 --&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"websites"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>prop</code> <code>key</code><code>=</code><code>"baidu"</code><code>&gt;www.baidu.com&lt;/</code><code>props</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>prop</code> <code>key</code><code>=</code><code>"google"</code><code>&gt;www.google.com.hk&lt;/</code><code>prop</code><code>&gt;</code>

<code>&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"child"</code> <code>parent</code><code>=</code><code>"parent"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 注意,這裡子bean在集合元素上加了屬性"merge=true" --&gt;</code>

<code>        </code><code>&lt;</code><code>props</code> <code>merge</code><code>=</code><code>"true"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>prop</code> <code>key</code><code>=</code><code>"google"</code><code>&gt;www.google.com&lt;/</code><code>prop</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>prop</code> <code>key</code><code>=</code><code>"tencent"</code><code>&gt;www.qq.com&lt;/</code><code>prop</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>property</code><code>&gt;    </code>

    通過上面的配置後,child中的屬性将變為:

<code>baidu=www.baidu.com</code>

<code>google=www.google.com</code>

<code>tencent=www.qq.com</code>