天天看點

Spring(27)——util命名空間Spring之util命名空間

util命名空間可以幫助我們快速的定義list、map、set等。如果要使用它,我們首先需要在XML配置檔案中引入其對應的namespace。

可以通過<code>util:properties</code>快速的定義一個Properties對象,可以通過其子元素<code>&lt;prop key=""&gt;&lt;/prop&gt;</code>來定義一個Properties的元素,key對應屬性名,而<code>&lt;prop&gt;</code>元素中間的文本值則為對應的屬性值。比如我們就定義了一個id為utilProperties,類型為java.util.Properties類型的bean,其擁有兩個鍵值對,分别是<code>a=a</code>和<code>b=b</code>。

<code>util:properties</code>的内容也可以來自一個外部檔案,此時可以通過location屬性引用對應的外部檔案。如下就引入了類路徑下的一個util.properties檔案作為定義的Properties的内容的一部分,此時使用子元素prop指定的鍵值對也同樣生效。

當通過location指定的外部檔案和通過子元素prop指定的鍵值對中擁有相同的Key時,預設通過location指定的檔案中定義的鍵值對擁有更高的優先級。比如上面的配置中如果util.properties中定義了<code>b=c</code>,則最終從該bean中擷取的Key為b的值将是檔案中定義的<code>c</code>。如果需要通過子元素prop指定的鍵值對擁有更高的優先級,則可以通過<code>local-override="true"</code>來控制,預設該屬性值是false。是以如果配置是下面這樣時,對于剛才的示例,擷取的Key為b的值仍然是<code>b</code>。

通過location屬性指定的本地檔案也可以是多個,多個檔案之間可以通過英文的逗号分隔。下面的示例就同時指定了類路徑下的util.properties和application.properties檔案。

通過location屬性指定了本地檔案後,如果對應的資源檔案不存在,預設是會抛出異常的。可以通過指定<code>ignore-resource-not-found="true"</code>來忽略檔案不存在的場景。

下面的UtilNamespaceBean擁有一個Properties類型的屬性properties,在不使用<code>util:properties</code>時,我們在注入Properties時需要如下這樣進行。

有了<code>util:properties</code>時可以這樣做:

雖然這看起來也沒有多簡單,但是它的好處就是可以引用外部的檔案。

可以通過<code>util:list</code>來定義一個<code>java.util.List</code>類型的bean,其子元素就是對應的List的元素,其子元素可以是一切可以用來定義對象的元素,比如value、bean等。以下代碼就簡單的通過value子元素定義兩個元素1和2。雖然它們的文本看上去是數字類型的,但是如果把它們取出來你會發現它們的類型其實是<code>java.lang.String</code>。

如果想讓他們的類型是數字類型,則可以通過<code>value-type</code>屬性指定元素值的類型,需要是數字類型則指定<code>value-type="java.lang.Integer"</code>。

<code>util:list</code>預設生成的是<code>java.util.ArrayList</code>類型的List,如果需要使用其它類型的List,則可以通過<code>list-class</code>來指定。比如下面就指定了生成的List是<code>java.util.LinkedList</code>。

如果是需要注入給某個bean,在不使用<code>util:list</code>時我們是通過list元素來定義list的,比如下面這樣:

可以通過<code>util:set</code>來定義一個<code>java.util.Set</code>類型的bean。它的用法和<code>util:list</code>是類似的。通過value子元素指定的值預設也是<code>java.lang.String</code>類型,可以通過<code>value-type</code>屬性來指定元素類型。

預設生成的Set是<code>java.util.LinkedHashSet</code>類型,可以通過<code>set-class</code>屬性來指定生成的Set的類型。

如果需要注入Set類型的屬性,在不使用<code>util:set</code>時是通過set元素來定義的,比如下面這樣:

可以通過<code>util:map</code>來定義一個Map類型的bean,Map中的每一個Entry則由其子元素entry來定義。每個Entry的key和value可以通過entry元素的key和value屬性來定義,比如下面的第一個entry;key也可以通過<code>key-ref</code>來引用bean容器中的一個bean,比如下面的第二個entry;value屬性指定的預設是<code>java.lang.String</code>類型,如果需要解析為其它類型,可以通過<code>value-type</code>屬性指定value的類型;value也可以通過<code>value-ref</code>來引用bean容器中的一個bean,比如下面的第三個entry;每個Entry的key和value也可以通過entry的子元素來表示,比如下面的第四和第五個entry。子元素下面的key用來指定Entry的key,如果是普通的key可以通過value子元素來表示,比如下面的第四個entry,如果是bean則可以通過bean子元素來定義,或者通過ref子元素來引用一個bean。value如果是普通的Value則可以直接通過entry的子元素value來定義,否則可以使用bean、ref這樣的子元素來表示一個對象。

如果需要注入Map類型的屬性,在不使用<code>util:map</code>時是通過map元素來定義的,比如下面這樣:

<code>util:constant</code>可以把一個常量定義為bean容器中的一個bean,可以通過id屬性指定對應的bean的id。<code>static-field</code>用來指定引用的static變量,需要是public類型的。

<code>util:property-path</code>可以用來把某個bean的某個屬性的值定義為一個bean,屬性值是可以級聯的,比如<code>a.b.c</code>就表示名為a的bean的b屬性的c屬性的值,擷取具體的屬性時都是通過get方法擷取的,是以<code>a.b.c</code>就相當于<code>a.getB().getC()</code>。id屬性用于指定生成的bean的id。<code>util:property-path</code>用于一個bean的某個屬性需要依賴于另一個bean的某個屬性的場景。

(注:本文是基于Spring4.1.0所寫)