7.5.9 组合属性

7.5.9 组合属性

Spring还支持组合属性的方式。例如,使用配置文件为形如foo.bar.name的属性设置参数值。Bean的组合属性设置参数值时,除最后一个属性之外,其他属性值都不允许为null
例如有如下的Bean

项目结构

1
2
3
4
5
6
7
8
9
10
11
E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\composite
└─src\
├─beans.xml
├─lee\
│ └─BeanTest.java
└─org\
└─crazyit\
└─app\
└─service\
├─ExampleBean.java
└─Person.java

ExampleBean.java

1
2
3
4
5
6
7
8
9
10
11
12
package org.crazyit.app.service;

public class ExampleBean
{
// 定义一个Person类型的成员变量
private Person person = new Person();
// person的getter方法
public Person getPerson()
{
return this.person;
}
}

上面Example Bean里提供了一个person成员变量,该person变量的类型是Person类, Person是个Java类, Person类里有一个String类型的name属性(有name实例变量及对应的getter, setter方法),则可以使用组合属性的方式为Example Beanpersonname指定值。配置文件如下。

beans.xml

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="exampleBean" class="org.crazyit.app.service.ExampleBean">
<!-- 驱动Spring调用exampleBean的getPerson().setName()方法,
以"孙悟空"作为参数 -->
<property name="person.name" value="孙悟空"/>
</bean>
</beans>

通过使用这种组合属性的方式, Spring允许直接为Bean实例的复合类型的属性指定值。但这种设置方式有一点需要注意:使用组合属性指定参数值时,除了最后一个属性外,其他属性都不能为null,否则将引发NullPointerException异常。例如,上面配置文件为person.name指定参数值,则example BeangetPerson()方法的返回值一定不能为null
对于这种注入组合属性值的形式,每个<property>元素依然是让Spring执行一次setter方法,但它不再直接调用该Beansetter方法,而是需要先调用getter方法,然后再去调用setter方法。例如上面的粗体字配置代码,相当于让Spring执行如下代码:
exampleBean.getperson().setName("孙悟空");
也就是说,组合属性只有最后一个属性才调用setter方法,前面各属性实际上对应于调用getter方法—这也是前面属性都不能为null的缘由
例如有如下配置片段:

1
2
3
<bean id="a" class="org.crazyit.app.service.AClass">
<property name="foo.bar.x.y" value="yyy"/>
</bean>

上面的组合属性注入相当于让Spring执行如下代码:

1
a.getFoo().getBar().getX().setY("yyy");