天天看點

Spring(04)——p命名空間和c命名空間4p命名空間和c命名空間

在通過構造方法或<code>set</code>方法給<code>bean</code>注入關聯項時通常是通過<code>constructor-arg</code>元素和<code>property</code>元素來定義的。在有了<code>p</code>命名空間和<code>c</code>命名空間時我們可以簡單的把它們當做<code>bean</code>的一個屬性來進行定義。

使用<code>p</code>命名空間時需要先聲明使用對應的命名空間,即在<code>beans</code>元素上加入<code>xmlns:p="http://www.springframework.org/schema/p"</code>。下面先來看一個示例。

在上面示例中,<code>id</code>為<code>hello1</code>的<code>bean</code>是傳統的<code>bean</code>定義,而<code>id</code>為<code>hello2</code>的<code>bean</code>是基于<code>p</code>命名空間的<code>bean</code>定義。當傳統的<code>property</code>元素定義的<code>value</code>是基礎資料類型時,我們可以直接把<code>property</code>元素對應的<code>name</code>加上<code>p</code>命名空間的字首作為<code>bean</code>的一個屬性進行定義,對應的值就是原<code>property</code>元素對應的<code>value</code>。如上述示例中<code>name</code>為<code>“p1”</code>的<code>property</code>使用<code>p</code>命名空間後就變成了<code>“p:p1”</code>;當傳統的<code>property</code>元素定義的是對其它<code>bean</code>的關聯時,我們可以直接把<code>property</code>元素對應的<code>name</code>加上<code>“-ref”</code>,再加上<code>p</code>命名空間的字首作為<code>bean</code>的一個屬性進行定義,對應的值為原<code>property</code>元素對應的<code>ref</code>值,如上述示例中<code>name</code>為<code>“world”</code>的<code>property</code>就是定義了對其它<code>bean</code>的關聯,使用<code>p</code>命名空間後就變成了<code>“p:world-ref”</code>。這裡有一點需要注意的地方就是<code>property</code>對應的是<code>set</code>方法,而不是對應的屬性,如<code>name</code>為<code>“world”</code>的<code>property</code>實際上對應的是<code>setWorld()</code>方法,這個時候不管對應的<code>bean</code>是否真存在名為<code>world</code>的屬性;另一點需要注意的地方是使用<code>p</code>命名空間時要注意以<code>“-ref”</code>結尾的<code>property</code>,這會導緻<code>Spring</code>以其前部分作為<code>property</code>,因為<code>“-ref”</code>會被<code>Spring</code>作為關聯的關鍵字。

<code>c</code>命名空間的用法和<code>p</code>命名空間類似,其對應于<code>constructor-arg</code>,即可以将<code>constructor-arg</code>元素替換為<code>bean</code>的一個以<code>c</code>命名空間字首開始的屬性。使用<code>c</code>命名空間之前也需要通過<code>xmlns:c=”http://www.springframework.org/schema/c”</code>進行聲明。

如上所示,<code>c</code>命名空間的用法和<code>p</code>命名空間的用法類似。對于通過構造方法注入原始類型的對象可以把對應的構造參數名稱加上<code>c</code>命名空間的字首作為<code>bean</code>的一個屬性進行定義,對應的值即是構造參數的值;如果通過構造參數注入的是其它<code>bean</code>的一個引用,則可将該構造參數名稱加上<code>“-ref”</code>,再加上<code>c</code>命名空間的字首作為該<code>bean</code>的一個屬性進行定義,對應的值為所關聯<code>bean</code>的<code>id</code>或<code>name</code>,如上述示例中的<code>“c:arg3-ref”</code>。

需要注意的是直接把構造參數名稱加上<code>c</code>命名空間的字首作為<code>bean</code>的一個屬性定義來替代對應的<code>constructor-arg</code>隻對以<code>debug</code>方式編譯的<code>class</code>有效,因為對于非<code>debug</code>方式編譯的<code>class</code>檔案<code>Spring</code>将無法擷取到對應構造方法的參數名。對于這種情況我們可以直接使用構造方法參數的索引加上下劃線<code>“_”</code>字首來代替對應的參數名,索引是從0開始的,如上面的示例以索引來代替時将是如下這個樣子。

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