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");
|