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 { private Person person = new Person(); public Person getPerson() { return this.person; } }
|
上面Example Bean里提供了一个person成员变量,该person变量的类型是Person类, Person是个Java类, Person类里有一个String类型的name属性(有name实例变量及对应的getter, setter方法),则可以使用组合属性的方式为Example Bean的person的name指定值。配置文件如下。
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">
<property name="person.name" value="孙悟空"/> </bean> </beans>
|
通过使用这种组合属性的方式, Spring允许直接为Bean实例的复合类型的属性指定值。但这种设置方式有一点需要注意:使用组合属性指定参数值时,除了最后一个属性外,其他属性都不能为null,否则将引发NullPointerException异常。例如,上面配置文件为person.name指定参数值,则example Bean的getPerson()方法的返回值一定不能为null。
对于这种注入组合属性值的形式,每个<property>元素依然是让Spring执行一次setter方法,但它不再直接调用该Bean的setter方法,而是需要先调用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");
|