spring裏MethodInvokingFactoryBean和MethodInvokingBean工具類

最近翻代碼,看到兩個工具類,能夠經過配置靈活的建立,修改你的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 裏。

相關文章
相關標籤/搜索