天天看點

[Spring] 注入Bean屬性

通常,javabean的屬性是私有的,同時擁有一組存取器方法,setxxx()和getxxx()形式存在。spring可以借助屬性的set方法來配置屬性的值,以實作setter方式的注入。

kenny是一個很有天賦的樂曲演奏家,由intrumentalist類定義,如下:

instrument接口定義如下:

在spring中可以使用<code>&lt;property&gt;</code>元素配置bean的屬性,如下例子展示了kenny bean的配置:

kenny是一個天才的演奏家,他可以演奏任何樂器,隻要這個樂器實作了instrument接口,定義一個樂器類saxophone:

在kenny演奏薩克斯之前,我們現在spring中将它聲明為一個bean,如下所示:

聲明之後就可以把它賦給kenny演奏了,我們對kenny的配置做如下修改:

下面我們可以執行如下代碼讓kenny表演:

輸出結果為:

playing jingle bells : toot toot toot

注入内部bean

内部bean是定義在其他bean内部的bean,如下配置将薩克斯聲明為内部bean:

内部bean并不僅限于setter注入,我們還可以把内部bean裝配到構造方法的入參中,正如下面的duke的新聲明所展示的:

内部bean沒有id屬性,雖然為内部bean配置一個id屬性完全是合法的,但是卻沒有必要。内部類最大的缺點:不能被複用。内部bean僅适用于一次注入,而且也不能被其他bean應用。使用内部bean會影響spring xml配置的可讀性。

spring的命名空間p提供了另一種bean屬性的裝配方式,該方式不需要配置如此多的尖括号。

命名空間p的schema uri為<code>http://www.springframework.org/schema/p</code>。如果你想使用命名空間p,主需要在spring的xml配置中增加如下一段聲明:

使用範例如下:

<code>-ref</code>字尾作為一個辨別來告知spring應該裝配一個引用而不是字面值。

當配置集合類型的bean屬性時,spring提供了4種類型的集合配置元素。

集合元素

用途

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

裝配list類型的值,允許重複

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

裝配set類型的值,不允許重複

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

裝配map類型的值,名稱和值可以是任意類型

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

裝配properties類型的值,名稱和值必須是string類型

當屬性為任意的java.util.collection類型時,<code>&lt;list&gt;</code>和<code>&lt;set&gt;</code>幾乎可以完全互換。

<code>&lt;map&gt;</code>和<code>&lt;props&gt;</code>這兩個元素分别對應java.util.map和java.util.properties。當我們需要由鍵-值對組成的集合時,這兩種配置元素非常有用。

hank能夠同時演奏多種樂器,由類onemanband定義:

我們使用list配置元素為hank賦予表演時所用到的樂器集合:

list元素包含一個或多個值,這裡的ref元素用來定義在spring上下文中的其他bean引用。當然還可以使用其他的spring設定元素作為list的成員,包括<code>&lt;vaue&gt;</code>、<code>&lt;bean&gt;</code>和<code>&lt;null&gt;</code>。實際上,list可以包含另一個list作為其成員,形成多元清單。

note:無論<code>&lt;list&gt;</code>還是<code>&lt;set&gt;</code>,都可以用來裝配類型為java.util.collection的任意實作或者數組的屬性。

裝配map集合

當onemanband表演時,假設我們還想知道每一個音符是由哪種樂器産生的,onemanband可以調整如下:

使用map元素配置instruments屬性,如下所示:

map中的entry元素由一個鍵和一個值組成,鍵和值可以是簡單類型,也可以是其他類型的引用,這些屬性将幫助我們指定entry的鍵和值:

屬性

key

指定map中entry的鍵為string

key-ref

指定map中entry的鍵為spring上下文中其他bean的引用

value

指定map中entry的值為string

value-ref

指定map中entry的值為spring上下文中其他bean的引用

裝配properties集合

一個範例如下:

note:術語比較

<code>&lt;property&gt;</code>元素用于把值或bean引用注入到bean的屬性中

<code>&lt;props&gt;</code>元素用于定義一個java.util.properties類型的集合值

<code>&lt;prop&gt;</code>元素用于定義<code>&lt;props&gt;</code>集合的一個成員。

通常情況下bean屬性的最初值都是null,直到你為它指派,但是有些bean會為它的屬性預設設定一個非空值。如果因為某些特殊原因,必須把屬性設定為空值,則可以顯式地為該屬性裝配一個null值。

為屬性設定null值,隻需使用<code>&lt;null/&gt;</code>元素,例如:

顯式地為屬性裝配null值的另一個理由是覆寫自動裝配的值。

轉載:http://blog.csdn.net/foreverling/article/details/50878992