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

Easter79
• 阅读 867

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

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配置文件中,分别为这些类型的属性注入值:

<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或集合属性等,因此、和元素又可以接受如下的子元素:

  • value:指定集合元素是基本数据类型值或字符串类型值

  • ref:指定集合元素是容器中另一个Bean实例

  • bean:指定集合元素是一个嵌套Bean

  • list、set、map及props:指定集合元素值又是集合

元素适用于配置Properties类型的属性,Properties类型时一种特殊的类型,其key和value都只能是字符串,故Spring配置Properties类型的属性都比较简单:每个属性项只要分别给出属性名和属性值就足够了。

当使用元素配置Map类型属性时稍显复杂,因为Map类型的元素由多个组成,每个又需要配置key和value两个属性。其中属性支持以下几个属性:

  • key:当key是基本类型或字符串时使用

  • 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
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Wesley13 Wesley13
3年前
java8新特性
Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str
Stella981 Stella981
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Easter79 Easter79
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k