Spring高级应用之注入各类集合
先定义一个测试类,由于本文将要介绍注入各种集合时如何配置,故这个类包含各种集合,类名和属性名不好取,没有特殊含义:
1 public class Test { 2 private List<String> listTest; 3 private Map<String, Object> mapTest; 4 private Set setTest; 5 private String[] arrayTest; 6 private Properties propertiesTest; 7 //下面是各个属性的setter,此处省略 8 //...... 9 }
Test类中,分别定义了List,Map,Set,Array等5种集合类型的属性,下面在Spring配置文件中,分别为这些类型的属性注入值:
1 < bean id = "test" class = "com.abc.Test" > 2 <!-- List类型的属性 --> 3 < property name = "listTest" > 4 <!-- 为list类型的属性注入值时,使用<list>元素 --> 5 < list > 6 <!-- 只要类型满足,每个<value>,<ref>,<bean>都可以配置一个list的元素 --> 7 < value >ListA</ value > 8 < value >ListB</ value > 9 < value >ListC</ value > 10 </ list > 11 </ property > 12 13 <!-- Map类型的属性 --> 14 < property name = "mapTest" > 15 <!-- 为map类型的属性注入值时,使用<map>元素 --> 16 < map > 17 <!-- 每一个<entry>都为<map>配置一个K-V对,同样, --> 18 < entry key = "key1" value = "value1" /> 19 <!-- 下面这个value指向了在此Spring文件中定义的另一个叫object的Bean --> 20 < entry key = "key2" value-ref = "object" /> 21 </ map > 22 </ property > 23 24 <!-- Set类型的属性 --> 25 < property name = "setTest" > 26 <!-- 为set类型的属性注入值时,使用<set>元素 --> 27 < set > 28 <!-- 只要类型满足,每个<value>,<ref>,<bean>都可以配置一个list的元素 --> 29 < value >SetA</ value > 30 <!-- 下面是一个嵌套Bean的定义。关于什么是嵌套Bean,请看:http://my.oschina.net/itblog/blog/204378 --> 31 < bean class = "com.abc.OtherBean1" /> 32 <!-- 下面引用了此Spring文件中定义的另一个Bean --> 33 < ref local = "com.abc.OtherBean2" /> 34 </ set > 35 </ property > 36 37 <!-- Properties类型的属性 --> 38 < property name = "propertiesTest" > 39 < props > 40 <!-- 每个<prop>元素指定一个属性项,其中key指定属性名 --> 41 < prop key = "prop1" >value1</ prop > 42 < prop key = "prop2" >value2</ prop > 43 </ props > 44 </ property > 45 46 <!-- 数组类型的属性 --> 47 < property name = "arrayTest" > 48 <!-- 为数组类型的属性注入值时,使用<array>元素 --> 49 < array > 50 <!-- 只要类型满足,每个<value>,<ref>,<bean>都可以配置一个list的元素 --> 51 < value >Array1</ value > 52 < bean class = "com.abc.OtherBean1" /> 53 < ref local = "com.abc.OtherBean2" /> 54 </ array > 55 </ property > 56 </ 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 < property name = "propertiesTest" > 2 < value > 3 key1=value1 4 key2=value2 5 </ value > 6 </ property >
虽然这种配置方式更简单,但是它也有一个缺点:属性名、属性值都只能是英文或数字,不能包含中文字符
从Spring2开始,Spring IoC容器支持集合的合并:子Bean中的集合属性可以从其父Bean的集合属性继承而来,同时,子Bean中的属性会覆盖父Bean中属性名相同的值。也就是说,子Bean的集合属性的最终值是父Bean、子Bean合并后的最终结果,下面是一个示例:
1 <!-- 将parent类型定义成抽象类 --> 2 < bean id = "parent" abstract = "true" class = "com.abc.Parent" > 3 <!-- 定义Properties类型的集合属性 --> 4 < property name = "websites" > 5 < props > 6 < prop key = "baidu" >www.baidu.com</ props > 7 < prop key = "google" >www.google.com.hk</ prop > 8 < props > 9 </ property > 10 </ bean > 11 < bean id = "child" parent = "parent" > 12 < property name = "websites" > 13 <!-- 注意,这里子Bean在集合元素上加了属性"merge=true" --> 14 < props merge = "true" > 15 < prop key = "google" >www.google.com</ prop > 16 < prop key = "tencent" >www.qq.com</ prop > 17 < props > 18 </ property > 19 </ bean >
通过上面的配置后,child中的属性将变为:
1 baidu=www.baidu.com 2 google=www.google.com 3 tencent=www.qq.com