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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

黑客走开系列1:Python使用元组做函数实参让代码更安全!

在Python内置对象中,列表、字典、集合属于可变序列,作为函数实参是不安全的,尤其是调用别人写好的恶意函数或者调用被人恶意修改过的函数时,很容易被修改实参。而...

28970
来自专栏老司机的技术博客

golang学习笔记2:基本结构与数据类型

除了以上介绍的这些关键字,Go 语言还有 36 个预定义标识符,其中包含了基本类型的名称和一些基本的内置函数。

10840
来自专栏Jerry的SAP技术分享

使用javap深入理解Java整型常量和整型变量的区别

下面我们就用javap将.class文件反编译出来然后深入研究Java里整型变量和整型常量的区别。

15530
来自专栏WD学习记录

html5学习笔记(二)

1. min、max、step属性用于包含数字或日期的input类型规定限定(约束)。

8110
来自专栏大数据挖掘DT机器学习

Python一些基础面试题目总结

1 Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一、对象的引用计数机制 pytho...

39260
来自专栏黑白安全

switch语句

多级elseif 显然是用于那些可能需要进行多级判断的情况。如果$a,正好是大于10,只需判断一次,但如果$a小于10那就必须经过“是不是大于10?,是不是等于...

8830
来自专栏java思维导图

【一分钟知识】异常处理,值传递和引用传递

异常处理 关键字:throws、throw、try、catch、finally try用来指定一块预防所有异常的程序; catch子句紧跟在try块后面,用来指...

34480
来自专栏Python小屋

奇怪,Python有的函数调用需要两对括号?(2)

在Python中,允许嵌套定义函数,也就是在一个函数A中可以定义另一个函数B。另外,在Python中,可调用对象可以分为三类:1)函数,2)类,3)含有特殊方法...

33890
来自专栏我的博客

echo、print、print_r、var_dump使用和区别

1、echo — Output one or more strings(输出一个或者多个字符串) 2、print — Output a string(输出一个字...

31370
来自专栏康怀帅的专栏

Bash 函数详解

默认情况下,脚本中定义的任何变量均为 全局变量,可以在函数内访问。 创建函数 # function关键字创建函数 function func1 { e...

31740

扫码关注云+社区

领取腾讯云代金券