集合
在<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类型。