Spring 開發之MethodInvokingFactoryBean學習
阿新 • • 發佈:2019-02-11
最近接觸基於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)注入時有兩種選擇,一種是需要指定如下兩個屬性(也是我看到的目前所有網上資料所說):
- targetClass: 確定目標 class。
- 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 完成,但必須指定以下兩個屬性。
- targetObject: 確定目標 bean,該 bean 可以是容器中己有的 bean,也可是巢狀 bean。
- 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 例項。