最近翻代碼,看到兩個工具類,能夠經過配置靈活的建立,修改你的bean實例。java
(InvoKeTestCls類代碼在文章最後)
MethodInvokingFactoryBean
它可讓你把目標對象(targetObject)方法(targetMethod)的返回值,做爲bean實例。
好比你能夠這樣配置beanspring
<bean id="sysProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass" value="java.lang.System"/> <property name="targetMethod" value="getProperties"/> </bean>
等價於java代碼:緩存
Properties sysProps=java.lang.System.getProperties();
也能夠,調用現有bean實例的某個方法,不須要返回值的。
好比你能夠這樣寫ide
<bean id="invokeTestCls" class="com.myspring.InvoKeTestCls"> </bean> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" ref="invokeTestCls"/> <property name="targetMethod" value="setName"/> <property name="arguments" value="xxName"/> </bean>
你獲得相似這樣的操做
工具
InvoKeTestCls invokeTestCls =new InvoKeTestCls(); invokeTestCls.setName("xxName");
此類中還有singleton屬性(默認爲true),可決定你每次請求的bean對象,
是不是從新調用目標對象的方法產生的返回值。拿上面的例子來講,
就是每次是否是都java.lang.System.getProperties()一遍返回的對象,仍是隻是調用一次,之後就用上次的緩存對象。this
MethodInvokingBean
它和MethodInvokingFactoryBean惟一不一樣點是它不支持返回bean方法的返回值
若是須要調用的bean沒有返回值的方法,spring建議你直接使用MethodInvokingBean。這樣也會減小spring自己的判斷損耗。
好比仍是上面的例子,你用MethodInvokingBean也能夠
code
<bean id="invokeTestCls" class="com.myspring.InvoKeTestCls"> </bean> <bean class="org.springframework.beans.factory.config.MethodInvokingBean"> <property name="targetObject" ref="invokeTestCls"/> <property name="targetMethod" value="setName"/> <property name="arguments" value=" xxName"/> </bean>
這樣的你invokeTestCls bean實例name字段就被設置成 xxNamexml
靜態方法你能夠這樣些對象
<bean id="invokeTestCls" class="com.myspring.InvoKeTestCls"> </bean> <bean class="org.springframework.beans.factory.config.MethodInvokingBean"> <property name="targetObject" ref="invokeTestCls"/> <property name="targetMethod" value="invokeTst"/> </bean>
一樣,你能夠改爲這樣
繼承
<bean class="org.springframework.beans.factory.config.MethodInvokingBean"> <property name="staticMethod" value="com.myspring.InvoKeTestCls.invokeTst"/> <!--注意改爲了staticMethod --> </bean>
附文:
public class InvoKeTestCls { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public static void invokeTst(){ System.out.println("ok.. static method invoke!"); } @Override public String toString() { return "InvoKeTestCls{" + "name='" + name + '\'' + '}'; } }
看類圖。
其實,MethodInvokingFactoryBean繼承了MethodInvokingBean,方法調用和對象建立大都在 MethodInvokingBean 裏。