1. 程式人生 > >Spring 開發之MethodInvokingFactoryBean學習

Spring 開發之MethodInvokingFactoryBean學習

最近接觸基於Spring的專案,發現機會每個Spring XML配置中,幾乎都有MethodInvokingFactoryBean,但來出來學習下。

用來做什麼

通過MethodInvokingFactory Bean類,可注入方法返回值。 MethodInvokingFactoryBean用來獲得某個方法的返回值,該方法既可以是靜態方法,也可以是例項方法。該方法的返回值可以注入bean例項屬性,也可以直接定義成bean例項。

程式碼示例

獲取靜態方法返回值,直接定義成bean例項,XML配置

1 2 3 4 5 6 7 8 9 10 11 <beans ...> <
bean id="sysProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass"> <value>java.lang.System</value> </property> <property name="targetMethod"> <value>getProperties</value> </property> </bean>
</beans>

Java 執行程式碼

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package cn.shitouer.spring.context; import java.util.Properties; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Context1 {
public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("cn.shitouer.springtest.xml"); Properties sysProps = (Properties) ctx.getBean("sysProps"); System.out.println("Java version is " + sysProps.get("java.version")); } }

執行如下

1 Java version is 1.7.0_45

使用靜態方法(static method)注入時有兩種選擇,一種是需要指定如下兩個屬性(也是我看到的目前所有網上資料所說):

  1. targetClass: 確定目標 class。
  2. targetMethod: 確定目標方法,確定通過目標 bean 的哪個方法返回值注入。

另一種方法是僅指定staticmethod,例如上邊的Spring XML可以配置為如下可實現同樣功能

1 2 3 4 5 6 7 8 <beans ...> <bean id="sysProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod"> <value>java.lang.System.getProperties</value> </property> </bean> </beans>

也就是說,必須Set a fully qualified static method name to invoke

使用bean 例項的方法(instance method)返回值注入,通過 MethodInvokingFactoryBean 完成,但必須指定以下兩個屬性。

  1. targetObject: 確定目標 bean,該 bean 可以是容器中己有的 bean,也可是巢狀 bean。
  2. targetMethod: 確定目標方法,確定通過目標 bean 的哪個方法返回值注入。

引用如上生成的bean例項,注入site屬性新生成的bean例項,XML如下

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <beans ...> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject"> <ref local="sysProps" /> </property> <property name="targetMethod"> <value>putAll</value> </property> <property name="arguments"> <props> </props> </property> </bean> </beans>

Java程式碼

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package cn.shitouer.spring.context; import java.util.Properties; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Context1 { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("cn.shitouer.springtest.xml"); Properties sysProps = (Properties) ctx.getBean("sysProps"); System.out.println("Java version is " + sysProps.get("java.version")); System.out.println("This article is Reprinted from " + sysProps.get("site")); } }

執行結果為

1 2 Java version is 1.7.0_45 This article is Reprinted from http://www.shitouer.cn/

配置檔案將例項方法返回值直接定義成bean這種方式,也可用於定義靜態工廠方法來建立bean 例項,或用例項工廠方法來建立 bean 例項。