最近翻代码,看到两个工具类,可以通过配置灵活的创建,修改你的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 里。