spring里MethodInvokingFactoryBean和MethodInvokingBean工具类

最近翻代码,看到两个工具类,可以通过配置灵活的创建,修改你的bean实例。

(InvoKeTestCls类代码在文章最后)
MethodInvokingFactoryBean
它可以让你把目标对象(targetObject)方法(targetMethod)的返回值,作为bean实例。
比如你可以这样配置bean

<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实例的某个方法,不需要返回值的。
比如你可以这样写

  <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()一遍返回的对象,还是只是调用一次,以后就用上次的缓存对象。


MethodInvokingBean
它和MethodInvokingFactoryBean唯一不同点是它不支持返回bean方法的返回值
如果需要调用的bean没有返回值的方法,spring建议你直接使用MethodInvokingBean。这样也会减少spring本身的判断损耗。
比如还是上面的例子,你用MethodInvokingBean也可以
 

 <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字段就被设置成 xxName

静态方法你可以这样些

<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 里。

转载于:https://my.oschina.net/u/146130/blog/994270

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值