如前一节所述,您可以将 bean 属性和构造函数参数定义为对其他托管 bean(协作者)的引用或内联定义的值。Spring 基于 XML 的配置元数据支持其 <property/>和 <constructor arg/>元素中的子元素类型。
字面量值
<property/>元素的 value 属性将属性或构造函数参数指定为人类可读的字符串表示形式。Spring 的 转换服务 用于将这些值从字符串转换为属性或参数的实际类型。以下示例显示了正在设置的各种值:\
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><!-- setDriverClassName(String) 方法将被调用 --><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb"/><property name="username" value="root"/><property name="password" value="misterkaoli"/></bean>
以下示例使用 p-namespace 进行更简洁的 XML 配置:
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"p:driverClassName="com.mysql.jdbc.Driver"p:url="jdbc:mysql://localhost:3306/mydb"p:username="root"p:password="misterkaoli"/></beans>
前面的 XML 更简洁。但是,拼写错误是在运行时而不是设计时发现的,除非您在创建 bean 定义时使用支持自动属性完成的 IDE(例如 IntelliJ IDEA 或 Spring Tools for Eclipse )。强烈推荐这种 IDE 帮助。
您还可以配置 java.util.Properties 实例,如下所示:
<bean id="mappings"class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"><!-- java.util.Properties --><property name="properties"><value>jdbc.driver.className=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mydb</value></property></bean>
Spring 容器将 <value/>元素中的文本转换为 java.util.Properties属性实例,使用 JavaBeans PropertyEditor 机制。这是一个很好的快捷方式,也是 Spring 团队喜欢使用嵌套的 <value/>元素而不是 value 属性样式的几个地方之一。
内部 Bean
<bean id="outer" class="..."><!-- 不要使用对目标 bean 的引用,只需内联定义目标 bean 即可 --><property name="target"><bean class="com.example.Person"> <!-- 这个是 inner bean --><property name="name" value="Fiona Apple"/><property name="age" value="25"/></bean></property></bean>
内部 bean 定义不需要定义的 ID 或名称。如果指定,容器不会使用这样的值作为标识符。容器在创建时也会忽略该 scope 标志,因为内部 bean 始终是匿名的,并且始终使用外部 bean 创建。不可能独立访问内部 bean 或将它们注入到协作 bean 中,而不是注入封闭 bean。
集合
<list/>、<set/>、<map/>和 <props/>元素分别设置 Java 集合类型 list、set、map 和properties 的属性和参数。以下示例显示了如何使用它们:
<bean id="moreComplexObject" class="example.ComplexObject"><!-- setAdminEmails(java.util.Properties) 方法被调用 --><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><!-- setSomeList(java.util.List) 被调用 --><property name="someList"><list><value>a list element followed by a reference</value><ref bean="myDataSource" /></list></property><!-- setSomeMap(java.util.Map) 被调用 --><property name="someMap"><map><entry key="an entry" value="just some string"/><entry key="a ref" value-ref="myDataSource"/></map></property><!-- setSomeSet(java.util.Set) 方法被调用 --><property name="someSet"><set><value>just some string</value><ref bean="myDataSource" /></set></property></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>
Null 和空字符串值
Spring 将属性等的空参数视为空字符串。以下基于 XML 的配置元数据片段将 email 属性设置为空字符串值("")。
<bean class="ExampleBean"><property name="email" value=""/></bean>
等效于
exampleBean.setEmail("");
<null/>元素处理 null 值。以下清单显示了一个示例:
exampleBean.setEmail(null);
复合属性名称
设置 bean 属性时,可以使用复合属性名或嵌套属性名,只要路径的所有组件(最终属性名除外)都不为null。考虑下面的 bean 定义:
<bean id="something" class="things.ThingOne"><property name="fred.bob.sammy" value="123" /></bean>
表示在 ThingOne 中有一个属性 fred,fred 下面有一个属性 bob
