《Spring Framework实战》10:4.1.4.2.详细的依赖和配置
欢迎观看《Spring Framework实战》视频教程
-
-
-
-
- 集合
-
-
-
<list/>、<set/>、<map/>和<props/>元素分别设置Java集合类型list、set、map和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>
映射键或值的值,或设置值,也可以是以下任何元素:
bean | ref | idref | list | set | map | props | value | null
-
-
-
-
-
- 集合合并
-
-
-
-
Spring容器还支持合并集合。应用程序开发人员可以定义父级<list/>、<map/>、<set/>或<props/>元素,并让子级<list/>、<map/>、<set/>或<props/>元素继承和覆盖父级集合中的值。也就是说,子集合的值是父集合和子集合元素合并的结果,子集合元素覆盖父集合中指定的值。
关于合并的这一节讨论了父子bean机制。不熟悉父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">
<!-- 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>
请注意,在子bean定义的adminEmails属性的<props/>元素上使用了merge=true属性。当容器解析并实例化子bean时,生成的实例具有一个adminEmails Properties集合,其中包含将子bean的adminEmail集合与父bean的adminEmails集合合并的结果。以下列表显示了结果:
administrator=administrator@example.com
sales=sales@example.com
support=support@example.co.uk
子Properties集合的值集继承了父<props/>的所有属性元素,子支持值的值覆盖了父集合中的值。
这种合并行为同样适用于<list/>、<map/>和<set/>集合类型。在<list/>元素的特定情况下,与list集合类型相关的语义(即有序值集合的概念)得以保持。父级的值位于子级列表的所有值之前。对于Map、Set和Properties集合类型,不存在排序。因此,对于容器内部使用的关联Map、Set和Properties实现类型所基于的集合类型,没有有效的排序语义。
-
-
-
-
-
- 集合合并的局限性
-
-
-
-
您不能合并不同的集合类型(如Map和List)。如果您尝试这样做,则会抛出相应的Exception。必须在较低的继承子定义上指定合并属性。在父集合定义上指定合并属性是多余的,不会导致所需的合并。
-
-
-
-
-
- 强类型集合
-
-
-
-
由于Java对泛型类型的支持,您可以使用强类型集合。也就是说,可以声明一个Collection类型,使其只能包含(例如)String元素。如果您使用Spring将强类型的Collection依赖注入bean,则可以利用Spring的类型转换支持,以便在将强类型Collection实例的元素添加到Collection之前将其转换为适当的类型。以下Java类和bean定义显示了如何做到这一点:
Java
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 bean的accounts属性准备好进行注入时,关于强类型Map<String,Float>的元素类型的泛型信息可以通过反射获得。因此,Spring的类型转换基础结构将各种值元素识别为Float类型,并将字符串值(9.99、2.75和3.99)转换为实际的Float类型。