先定義一個測試類,因爲本文將要介紹注入各類集合時如何配置,故這個類包含各類集合,類名和屬性名很差取,沒有特殊含義:java
public class Test { private List<String> listTest; private Map<String, Object> mapTest; private Set setTest; private String[] arrayTest; private Properties propertiesTest; //下面是各個屬性的setter,此處省略 //...... }
Test類中,分別定義了List,Map,Set,Array等5種集合類型的屬性,下面在Spring配置文件中,分別爲這些類型的屬性注入值:web
<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 --> <bean class="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> <bean class="com.abc.OtherBean1" /> <ref local="com.abc.OtherBean2" /> </list> </property> </bean>
因爲集合元素有能夠是基本類型值、引用容器中其餘Bean、嵌套Bean或集合屬性等,所以<list>、<set>、和<key>元素又能夠接受以下的子元素:數組
value:指定集合元素是基本數據類型值或字符串類型值測試
ref:指定集合元素是容器中另外一個Bean實例google
bean:指定集合元素是一個嵌套Beanspa
list、set、map及props:指定集合元素值又是集合.net
<props>元素適用於配置Properties類型的屬性,Properties類型時一種特殊的類型,其key和value都只能是字符串,故Spring配置Properties類型的屬性都比較簡單:每一個屬性項只要分別給出屬性名和屬性值就足夠了。
code
當使用<map>元素配置Map類型屬性時稍顯複雜,由於Map類型的元素由多個<entry>組成,每一個<entry>又須要配置key和value兩個屬性。其中<entry>屬性支持如下幾個屬性:xml
key:當key是基本類型或字符串時使用blog
key-ref:當key類型是容器中定義的另外一個Bean時使用
value:當value是基本類型或字符串時使用
value-ref:當value是容器中定義的另外一個Bean時使用
Spring還提供了一個簡化語法來支持Properties形參的setter方法,例如咱們可使用以下配置片斷來配置Properties類型的屬性:
<property name="propertiesTest"> <value> key1=value1 key2=value2 </value> </property>
雖然這種配置方式更簡單,可是它也有一個缺點:屬性名、屬性值都只能是英文或數字,不能包含中文字符
從Spring2開始,Spring IoC容器支持集合的合併:子Bean中的集合屬性能夠從其父Bean的集合屬性繼承而來,同時,子Bean中的屬性會覆蓋父Bean中屬性名相同的值。也就是說,子Bean的集合屬性的最終值是父Bean、子Bean合併後的最終結果,下面是一個示例:
<!-- 將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中的屬性將變爲:
baidu=www.baidu.com google=www.google.com tencent=www.qq.com