如前一节所述,您可以将 bean 属性和构造函数参数定义为对其他托管 bean(协作者)的引用或内联定义的值。Spring 基于 XML 的配置元数据支持其 <property/><constructor arg/>元素中的子元素类型。

字面量值

<property/>元素的 value 属性将属性或构造函数参数指定为人类可读的字符串表示形式。Spring 的 转换服务 用于将这些值从字符串转换为属性或参数的实际类型。以下示例显示了正在设置的各种值:\

  1. <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  2. <!-- setDriverClassName(String) 方法将被调用 -->
  3. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  4. <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
  5. <property name="username" value="root"/>
  6. <property name="password" value="misterkaoli"/>
  7. </bean>

以下示例使用 p-namespace 进行更简洁的 XML 配置:

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:p="http://www.springframework.org/schema/p"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. https://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
  7. destroy-method="close"
  8. p:driverClassName="com.mysql.jdbc.Driver"
  9. p:url="jdbc:mysql://localhost:3306/mydb"
  10. p:username="root"
  11. p:password="misterkaoli"/>
  12. </beans>

前面的 XML 更简洁。但是,拼写错误是在运行时而不是设计时发现的,除非您在创建 bean 定义时使用支持自动属性完成的 IDE(例如 IntelliJ IDEASpring Tools for Eclipse )。强烈推荐这种 IDE 帮助。

您还可以配置 java.util.Properties 实例,如下所示:

  1. <bean id="mappings"
  2. class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
  3. <!-- java.util.Properties -->
  4. <property name="properties">
  5. <value>
  6. jdbc.driver.className=com.mysql.jdbc.Driver
  7. jdbc.url=jdbc:mysql://localhost:3306/mydb
  8. </value>
  9. </property>
  10. </bean>

Spring 容器将 <value/>元素中的文本转换为 java.util.Properties属性实例,使用 JavaBeans PropertyEditor 机制。这是一个很好的快捷方式,也是 Spring 团队喜欢使用嵌套的 <value/>元素而不是 value 属性样式的几个地方之一。

内部 Bean

  1. <bean id="outer" class="...">
  2. <!-- 不要使用对目标 bean 的引用,只需内联定义目标 bean 即可 -->
  3. <property name="target">
  4. <bean class="com.example.Person"> <!-- 这个是 inner bean -->
  5. <property name="name" value="Fiona Apple"/>
  6. <property name="age" value="25"/>
  7. </bean>
  8. </property>
  9. </bean>

内部 bean 定义不需要定义的 ID 或名称。如果指定,容器不会使用这样的值作为标识符。容器在创建时也会忽略该 scope 标志,因为内部 bean 始终是匿名的,并且始终使用外部 bean 创建。不可能独立访问内部 bean 或将它们注入到协作 bean 中,而不是注入封闭 bean。

集合

<list/><set/><map/><props/>元素分别设置 Java 集合类型 list、set、map 和properties 的属性和参数。以下示例显示了如何使用它们:

  1. <bean id="moreComplexObject" class="example.ComplexObject">
  2. <!-- setAdminEmails(java.util.Properties) 方法被调用 -->
  3. <property name="adminEmails">
  4. <props>
  5. <prop key="administrator">administrator@example.org</prop>
  6. <prop key="support">support@example.org</prop>
  7. <prop key="development">development@example.org</prop>
  8. </props>
  9. </property>
  10. <!-- setSomeList(java.util.List) 被调用 -->
  11. <property name="someList">
  12. <list>
  13. <value>a list element followed by a reference</value>
  14. <ref bean="myDataSource" />
  15. </list>
  16. </property>
  17. <!-- setSomeMap(java.util.Map) 被调用 -->
  18. <property name="someMap">
  19. <map>
  20. <entry key="an entry" value="just some string"/>
  21. <entry key="a ref" value-ref="myDataSource"/>
  22. </map>
  23. </property>
  24. <!-- setSomeSet(java.util.Set) 方法被调用 -->
  25. <property name="someSet">
  26. <set>
  27. <value>just some string</value>
  28. <ref bean="myDataSource" />
  29. </set>
  30. </property>
  31. </bean>

强类型集合

  1. public class SomeClass {
  2. private Map<String, Float> accounts;
  3. public void setAccounts(Map<String, Float> accounts) {
  4. this.accounts = accounts;
  5. }
  6. }
  1. <beans>
  2. <bean id="something" class="x.y.SomeClass">
  3. <property name="accounts">
  4. <map>
  5. <entry key="one" value="9.99"/>
  6. <entry key="two" value="2.75"/>
  7. <entry key="six" value="3.99"/>
  8. </map>
  9. </property>
  10. </bean>
  11. </beans>

Spring 会将 value 转换为 Float 类型

Null 和空字符串值

Spring 将属性等的空参数视为空字符串。以下基于 XML 的配置元数据片段将 email 属性设置为空字符串值("")。

  1. <bean class="ExampleBean">
  2. <property name="email" value=""/>
  3. </bean>

等效于

  1. exampleBean.setEmail("");

<null/>元素处理 null 值。以下清单显示了一个示例:

  1. exampleBean.setEmail(null);

复合属性名称

设置 bean 属性时,可以使用复合属性名或嵌套属性名,只要路径的所有组件(最终属性名除外)都不为null。考虑下面的 bean 定义:

  1. <bean id="something" class="things.ThingOne">
  2. <property name="fred.bob.sammy" value="123" />
  3. </bean>

表示在 ThingOne 中有一个属性 fred,fred 下面有一个属性 bob