Collections合并
Spring容器还支持合并集合。 应用程序开发人员可以定义父,
关于合并的本节讨论了父子bean机制。 不熟悉父级和子级bean定义的读者可能希望先阅读相关部分,然后再继续。
以下示例演示了集合合并:
<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">
<!-- 合并是在子集合定义上指定的 -->
<props merge="true">
<prop key="sales">sales@example.com</prop>
<prop key="support">support@example.co.uk</prop>
</props>
</property>
</bean>
<beans>
注意,在子bean定义的adminEmails属性的**元素上使用了merge = true**属性。 当子bean由容器解析并实例化后,生成的实例将具有adminEmails属性集合,其中包含将子项的adminEmails集合与父项的adminEmails集合合并的结果。 以下清单显示了结果:
administrator=administrator@example.com
sales=sales@example.com
support=support@example.co.uk
子“属性”集合的值集继承了父****的所有属性元素,并且子项的支持值覆盖了父集合中的值。
这种合并行为类似地适用于,
Collections合并的局限性
您不能合并不同的集合类型(例如map和list)。如果您确实尝试这样做,则会抛出适当的Exception。 必须在下面的继承的子定义中指定merge属性。 在父集合定义上指定merge属性是多余的,不会导致所需的合并。
强类型集合
随着Java 5中泛型类型的引入,您可以使用强类型集合。 也就是说,可以声明一个Collection类型,使其只能包含(例如)String元素。 如果使用Spring将强类型的Collection依赖注入到Bean中,则可以利用Spring的类型转换支持,以便在将强类型的Collection实例的元素添加到Bean中之前,先将其转换为适当的类型集合。以下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>
当准备注入某物bean的accounts属性时,可以通过反射获得有关强类型Map <String,Float>的元素类型的泛型信息。 因此,Spring的类型转换基础结构将各种值元素识别为Float类型,并将字符串值(9.99、2.75和3.99)转换为实际的Float类型。