javascript
Spring高级应用之注入各类集合
先定義一個測試類,由于本文將要介紹注入各種集合時如何配置,故這個類包含各種集合,類名和屬性名不好取,沒有特殊含義:
| 1 2 3 4 5 6 7 8 9 | publicclass Test { ????privateList<String> listTest; ????privateMap<String, Object> mapTest; ????privateSet setTest; ????privateString[] arrayTest; ????privateProperties propertiesTest; ????//下面是各個屬性的setter,此處省略 ????//...... } |
Test類中,分別定義了List,Map,Set,Array等5種集合類型的屬性,下面在Spring配置文件中,分別為這些類型的屬性注入值:
| 1 2 3 4 5 6 7 8 9 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 | <bean id="test"class="com.abc.Test"> ????<!-- List類型的屬性 --> ????<property name="listTest"> ????????<!-- 為list類型的屬性注入值時,使用<list>元素 --> ????????<list> ????????????<!-- 只要類型滿足,每個<value>,<ref>,<bean>都可以配置一個list的元素 --> ????????????<value>ListA</value> ????????????<value>ListB</value> ????????????<value>ListC</value> ????????</list> ????</property> ????<!-- Map類型的屬性 --> ????<property name="mapTest"> ????????<!-- 為map類型的屬性注入值時,使用<map>元素 --> ????????<map> ????????????<!-- 每一個<entry>都為<map>配置一個K-V對,同樣, --> ????????????<entry key="key1"value="value1"/> ????????????<!-- 下面這個value指向了在此Spring文件中定義的另一個叫object的Bean --> ????????????<entry key="key2"value-ref="object"/> ????????</map> ????</property> ????<!-- Set類型的屬性 --> ????<property name="setTest"> ????????<!-- 為set類型的屬性注入值時,使用<set>元素 --> ????????<set> ????????????<!-- 只要類型滿足,每個<value>,<ref>,<bean>都可以配置一個list的元素 --> ????????????<value>SetA</value> ????????????<!-- 下面是一個嵌套Bean的定義。關于什么是嵌套Bean,請看:http://my.oschina.net/itblog/blog/204378 --> ????????????<beanclass="com.abc.OtherBean1"/> ????????????<!-- 下面引用了此Spring文件中定義的另一個Bean --> ????????????<ref local="com.abc.OtherBean2"/> ????????</set> ????</property> ????<!-- Properties類型的屬性 --> ????<property name="propertiesTest"> ????????<props> ????????????<!-- 每個<prop>元素指定一個屬性項,其中key指定屬性名 --> ????????????<prop key="prop1">value1</prop> ????????????<prop key="prop2">value2</prop> ????????</props> ????</property> ????<!-- 數組類型的屬性 --> ????<property name="arrayTest"> ????????<!-- 為數組類型的屬性注入值時,使用<list>元素 --> ????????<list> ????????????<!-- 只要類型滿足,每個<value>,<ref>,<bean>都可以配置一個list的元素 --> ????????????<value>Array1</value> ????????????<beanclass="com.abc.OtherBean1"/> ????????????<ref local="com.abc.OtherBean2"/> ????????</list> ????</property> </bean> |
由于集合元素有可以是基本類型值、引用容器中其他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類型的屬性:
| 1 2 3 4 5 6 | <property name="propertiesTest"> ????<value> ????????key1=value1 ????????key2=value2 ????</value> </property> |
雖然這種配置方式更簡單,但是它也有一個缺點:屬性名、屬性值都只能是英文或數字,不能包含中文字符
從Spring2開始,Spring IoC容器支持集合的合并:子Bean中的集合屬性可以從其父Bean的集合屬性繼承而來,同時,子Bean中的屬性會覆蓋父Bean中屬性名相同的值。也就是說,子Bean的集合屬性的最終值是父Bean、子Bean合并后的最終結果,下面是一個示例:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <!-- 將parent類型定義成抽象類 --> <bean id="parent"abstract="true"class="com.abc.Parent"> ????<!-- 定義Properties類型的集合屬性 --> ????<property name="websites"> ????????<props> ????????????<prop key="baidu">www.baidu.com</props> ????????????<prop key="google">www.google.com.hk</prop> ????????<props> ????</property> </bean> <bean id="child"parent="parent"> ????<property name="websites"> ????????<!-- 注意,這里子Bean在集合元素上加了屬性"merge=true"--> ????????<props merge="true"> ????????????<prop key="google">www.google.com</prop> ????????????<prop key="tencent">www.qq.com</prop> ????????<props> ????</property>??? </bean> |
通過上面的配置后,child中的屬性將變為:
| 1 2 3 | baidu=www.baidu.com google=www.google.com tencent=www.qq.com |
原文出處:?擺渡者
from:?http://www.importnew.com/20881.html
總結
以上是生活随笔為你收集整理的Spring高级应用之注入各类集合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Spring】Bean的生命周期
- 下一篇: Spring容器中Bean的作用域