Spring高级应用之注入各类集合

先定义一个测试类,由于本文将要介绍注入各种集合时如何配置,故这个类包含各种集合,类名和属性名不好取,没有特殊含义:

1public 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        <!-- 为数组类型的属性注入值时,使用<list>元素 --> 49        <list> 50            <!-- 只要类型满足,每个<value><ref><bean>都可以配置一个list的元素 --> 51            <value>Array1</value> 52            <bean class="com.abc.OtherBean1" /> 53            <ref local="com.abc.OtherBean2" /> 54        </list> 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中的属性将变为:

1baidu=www.baidu.com 2google=www.google.com 3tencent=www.qq.com
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

sql注入

反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o

java8新特性

Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str