Spring 依赖和配置的细节-05 集合

集合

        在<list/>, <set/>,<map/> 和<propes/> 元素中,您可以分别配置Java集合类型 List, Set, Map, and Properties的属性和参数。 以下示例显示了如何使用它们:

<bean id="moreComplexObject" class="example.ComplexObject">
    <!-- results in a setAdminEmails(java.util.Properties) call -->
    <property name="adminEmails">
        <props>
            <prop key="administrator">administrator@example.org</prop>
            <prop key="support">support@example.org</prop>
            <prop key="development">development@example.org</prop>
        </props>
    </property>
    <!-- results in a setSomeList(java.util.List) call -->
    <property name="someList">
        <list>
            <value>a list element followed by a reference</value>
            <ref bean="myDataSource" />
        </list>
    </property>
    <!-- results in a setSomeMap(java.util.Map) call -->
    <property name="someMap">
        <map>
            <entry key="an entry" value="just some string"/>
            <entry key ="a ref" value-ref="myDataSource"/>
        </map>
    </property>
    <!-- results in a setSomeSet(java.util.Set) call -->
    <property name="someSet">
        <set>
            <value>just some string</value>
            <ref bean="myDataSource" />
        </set>
    </property>
</bean>

当然,map的key或者value,或者集合的value都可以配置为下列元素之一:

bean | ref | idref | list | set | map | props | value | null

集合的合并

        Spring的容器也支持集合合并,开发者可以定义父样式的<list/>, <set/>,<map/> 或<propes/> 元素, 同时有子样式的<list/>, <set/>,<map/> 或<propes/> 元素。也就是说,子集合的值是父元素和子元素集合的合并值。

以下示例演示了集合合并:

<beans>
    <bean id="parent" abstract="true" class="example.ComplexObject">
        <property name="adminEmails">
            <props>
                <prop key="administrator">administrator@example.com</prop>
                <prop key="support">support@example.com</prop>
            </props>
        </property>
    </bean>
    <bean id="child" parent="parent">
        <property name="adminEmails">
            <!-- the merge is specified on the child collection definition -->
            <props merge="true">
                <prop key="sales">sales@example.com</prop>
                <prop key="support">support@example.co.uk</prop>
            </props>
        </property>
    </bean>
<beans>

        请注意,在child bean 定义的adminEmails中的使用merge=true 属性。 当容器解析并实例化child bean时,生成的实例有一个adminEmails属性集合, 其实例中包含的adminEmails集合就是child的adminEmails以及parent的adminEmails集合。以下清单显示了结果:

administrator=administrator@example.com
sales=sales@example.com
support=support@example.co.uk

子属性集合的值集继承父<propes/> 的所有属性元素,子值的支持值覆盖父集合中的值。

这个合并的行为和<list/>,<map/> 和<set/> 之类的集合类型的行为是类似的。List 在特定例子中,与List集合类型类似, 有着隐含的 ordered概念。所有的父元素里面的值,是在所有子元素的值之前配置的。但是像Map, Set, 和 Properties的集合类型,是不存在顺序的。

集合合并的限制

        您不能合并不同类型的集合(例如要将Map 和List合并是不可能的)。如果开发者硬要这样做就会抛出异常, merge的属性是必须特指到更低级或者继承的子节点定义上, 特指merge属性到父集合的定义上是冗余的,而且在合并上也没有任何效果。

强类型的集合

        在Java 5以后,开发者可以使用强类型的集合了。也就是,开发者可以声明Collection类型,然后这个集合只包含String元素(举例来说)。 如果开发者通过Spring来注入强类型的Collection到bean中,开发者就可以利用Spring的类型转换支持来做到 以下Java类和bean定义显示了如何执行此操作:

public class SomeClass {

    private Map<String, Float> accounts;

    public void setAccounts(Map<String, Float> accounts) {
        this.accounts = accounts;
    }
}
<beans>
    <bean id="something" class="x.y.SomeClass">
        <property name="accounts">
            <map>
                <entry key="one" value="9.99"/>
                <entry key="two" value="2.75"/>
                <entry key="six" value="3.99"/>
            </map>
        </property>
    </bean>
</beans>

        当something的属性accounts准备注入的时候,accounts的泛型信息MapMap 就会通过反射拿到。 这样,Spring的类型转换系统能够识别不同的类型,如上面的例子Float然后会将字符串的值9.99, 2.75, 和3.99转换成对应的Float类型。

public class SomeClass {

    private Map<String, Float> accounts;

    public void setAccounts(Map<String, Float> accounts) {
        this.accounts = accounts;
    }
}
<beans>
    <bean id="something" class="x.y.SomeClass">
        <property name="accounts">
            <map>
                <entry key="one" value="9.99"/>
                <entry key="two" value="2.75"/>
                <entry key="six" value="3.99"/>
            </map>
        </property>
    </bean>
</beans>

        当something的属性accounts准备注入的时候,accounts的泛型信息Map,Map 就会通过反射拿到。 这样,Spring的类型转换系统能够识别不同的类型,如上面的例子Float然后会将字符串的值9.99, 2.75, 和3.99转换成对应的Float类型。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值