码迷,mamicode.com
首页 > 编程语言 > 详细

Spring笔记——7.高级依赖关系配置

时间:2015-09-02 02:08:22      阅读:199      评论:0      收藏:0      [点我收藏+]

标签: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笔记——7.高级依赖关系配置

标签:spring

原文地址:http://mengcao.blog.51cto.com/9395052/1690642

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!