标签:spring
为了方便与可读性,组件与组件2之间的耦合使用配置文件依赖注入,而基本类型的成员变量则直接爱代码中设置。有的时候bean的属性值可能是某个方法的返回值,或者类的field值,或者是另一个对象的get方法的返回值。Spring支持将任意方法的返回值、类或者对象的Feild值,其他bean的get返回值直接定义成容器中的一个bean。
获取其他bean的属性值
PropertyPathFactoryBean用来获取其他bean的属性值(get的返回值)获得的值可以注入给其他bean,也可以定义为新的bean。需要制定调用哪个bean的哪个get方法。
<bean id="son1" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <!--目标bean,告诉去哪个bean中找get方法--> <property name="targetBeanName" value="person"/> <property name="propertyPath" value="son"/> </bean>
如上代码标识,Spring取出person这个bean的son属性,然后将这个son结果以bean的形式放在容器中。propertyPath的value还支持复合属性的形式,比如把son换成son.age则表示使用peroson对象中的son属性的age属性的get方法。如果想直接把返回结果赋值给其他的bean。此时需要使用嵌套bean。
<bean id="tootherbean" class="com.cm.Son"> <property name="age"> <!-- 使用嵌套bean为age的set方法提供参数 --> <bean id="person.son.age" class="org.springframework.beans.factory.config.PropertiesFactoryBean"/> </property> </bean>
这里取了person的son属性的age属性,因为是嵌套bean,它可以作为property的value属性存在,也就是说这个嵌套bean的值赋给了tootherbean这个bean的age属性。
除此之外我们还有一种更简单的方法。
<util:property-path id="son1" path="person.son"/>
它表示把容器中名为person的bean的son属性值取出来,作为一个son1的bean放入容器中。
或者这样,表示person的son属性的age属性的值作为一个返回值赋给tootherbean这个bean的age属性值。
<bean id="tootherbean" class="com.cm.Son"> <property name="age"> <util:property-path path="person.son.age"/> </property> </bean>
获取Field值
与属性值类似,荣国FieldRetrieveingFactoryBean类,我们可以访问静态的Field或者对象的实例,访问值可以设成一个新的bean,或者注入其他bean。这里也需要说明两个问题:要访问哪个类,这个类的哪个Field。
<bean id="son1" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <property name="targetClass" value="java.sql.Connection"/> <property name="targetField" value="TRANSACTION_SERIALIZABLE"/> </bean>
此外这个工厂bean还有一个setStaticField方法,可以同时制定哪个类的哪个静态Field值。所以上述代码可这样写:
<bean id="son1" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <property name="staticField" value="java.sql.Connection.TRANSACTION_SERIALIZABLE"/> </bean>
如果想把上面结果赋值给某个bean,则:
<bean id="tootherbean" class="com.cm.Son"> <property name="age"> <bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> </property> </bean>
在这里嵌套bean的id属性是制定Field表达式。
获取方法返回值
可以通过MethodInvokingFactoryBean这个工厂调用任意类的类方法,或者任意对象的实例方法。如果方法由返回值,则可直接生成新的bean,或者赋值给其他bean的成员变量。无论希望调用静态方法还是实例方法,都要制定TargetClass(或者TargetObject),targetMethod和arguments(没参数就省略这个)。
<bean class="org.springframework.beans.factory.config.MethodInvokingBean"> <property name="targetObject" ref="jp" /> <property name="targetMethod" value="add" /> <property name="arguments"> <list> <ref bean=jb2 /> </list> </property> </bean>
此段代码相当于jf.add(jb2),即jf实例调用add方法,并且有一个jb2这个实例作为参数。
至此,我们已经能够用xml代表所有的代码了。
set就是通过property元素,get就是通过PropertyPathFactoryBean,创建对象就是bean元素,普通方法如上所示,Field值也可以得到了。但是一般我们只把跟项目升级有关的经常需要改动的代码写在xml中,或者那些能够增加耦合的代码。
本文出自 “指尖轻飞” 博客,谢绝转载!
标签:spring
原文地址:http://mengcao.blog.51cto.com/9395052/1690642