7.10.1 获取其他Bean的属性值
PropertyPathFactoryBean
用来获取目标Bean
的属性值(实际上就是它的getter
方法的返回值),获得的值可注入给其他Bean
,也可直接定义成新的Bean
使用PropertyPathFactoryBean
来调用其他Bean
的getter
方法需要指定如下信息。
- 调用哪个对象。由
PropertyPathFactoryBean
的setTargetObject(Object targetObject)
方法指定 - 调用哪个
getter
方法。由PropertyPathFactoryBean
的setPropertyPath(String propertyPath)
方法指定。
程序示例
项目结构
1 | E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\PropertyPathFactoryBean |
beans.xml
看如下配置文件:
1 |
|
SpringTest.java
主程序如下:
1 | package lee; |
执行结果如下:
1 | 系统获取的son1:Son[age=11] |
上面配置文件使用PropertyPathFactoryBean
来获取指定Bean
的、指定getter
方法的返回值,如下代码:
1 | <!-- 将指定Bean实例的getter方法返回值定义成son1 Bean --> |
指定了获取person
这个Bean
的gerSon()
方法的返回值,然后将返回值直接定义成容器中id
为son1
的Bean
.
PropertyPathFactoryBean
就是工厂Bean
,关于工厂Bean
的介绍可参考7.8.3节的内容,工厂Bean
专门返回某个类型的值,并不是返回该Bean
的实例。
PropertyPathFactoryBean的工厂Bean的id属性是属性表达式的值
注意:配置PropertyPathFactoryBean
工厂Bean
时指定的id
属性,并不是该工厂Bean
的唯一标识,而是用于指定属性表达式
的值,可以对该属性表达式的值进行简写,例如:将该工厂Bean
的id
属性设置为person.son.age
则表示person.getSon().getAge()
的返回值作为一个Bean
.
1 | <!-- 以下是访问指定Bean的getter方法的简单方式, person.son.age代表获取person.getSon().getAge() --> |
Spring
获取指定Bean
的getter
方法的返回值之后,该返回值不仅可直接定义成容器中的Bean
实例,还可注入另一个Bean
作为成员变量。
对上面的配置文件增加如下一段。
1 | <!-- 下面定义son2 Bean --> |
主程序部分增加如下的输出语句:
1 | System.out.println("系统获取的son2:" + ctx.getBean("son2")); |
运行主程序,此输出语句的执行结果如下:
1 | 系统获取的son2:Son[age=11] |
从上面的粗体字代码可以看出,程序调用son2
实例的setAge()
方法时的参数并不是直接指定的,而是将容器中另一个Bean
实例的属性值( getter
方法的返回值)作为setAge()
方法的参数,PropertyPathFactoryBean
工厂Bean
负责获取容器中另一个Bean
的属性值(getter
方法的返回值)
使用复合形式设置getter方法
为PropertyPathFactoryBean
的setPropertyPath()
方法指定属性表达式时,还支持使用复合属性的形式,例如:想获取person Bean
的getSon().getAge()
的返回值,可采用son.age
的形式.
在配置文件中再增加如下一段:
1 | <!-- 将基本数据类型的属性值定义成Bean实例 --> |
主程序部分增加如下输出语句:
1 | System.out.println("系统获取的theAge的值:" + ctx.getBean("theAge")); |
该条语句输出结果如下:
1 | 系统获取的theAge的值:11 |
以嵌套的Bean实例作为目标Bean
目标Bean
既可以是容器中已有的Bean
实例,也可以是嵌套Bean
实例。因此,下面的定义也是有效的。
1 | <!-- 将基本数据类型的属性值定义成Bean实例 --> |
util:property-path元素
<util:property-path>
元素可作为PropertyPathFactoryBean
的简化配置,使用该元素时可指定如下两个属性。
属性 | 描述 |
---|---|
id |
该属性指定将getr 方法的返回值定义成名为i的Bean 实例。 |
path |
该属性指定将哪个Bean 实例、哪个属性(支持复合属性)暴露出来 |
如果需要使用<util:property-path>
元素,则必须在Spring
配置文件中导入util:
命名空间。关于导入util:
命名空间的详细步骤请参考7.11.3节。
上面的son1
这个Bean
:
1 | <bean id="son1" |
可简化为如下配置:
1 | <util:property-path id="son1" path="person.son"/> |
上面的son2
这个Bean
:
1 | <bean id="son2" class="org.crazyit.app.service.Son"> |
可简化为如下配置:
1 | <bean id="son2" class="org.crazyit.app.service.Son"> |
原文链接: 7.10.1 获取其他Bean的属性值