Main Tutorials

Spring MethodInvokingFactoryBean Example

spring MethodInvokingFactoryBean  type hierarchy

In Spring, you can use MethodInvokingFactoryBean to run a method, get the result and inject the result into another bean. This method invoker is very useful in XML configuration, but less use now in favor of annotation and Spring expression.

1. MethodInvokingFactoryBean

1.1 Example to get the current Java version.

Spring XML Configuration
 
	<!-- 1. Run getProperties() method from java.lang.System -->
	<bean id="propsFromSystem"
		class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
		<property name="targetClass" value="java.lang.System" />
		<property name="targetMethod" value="getProperties" />
	</bean>

	<!-- 2. Run getProperty() method from propsFromSystem, with argument 'java.version' -->
	<bean id="javaVersion"
		class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
		<property name="targetObject" ref="propsFromSystem" />
		<property name="targetMethod" value="getProperty" />
		<property name="arguments" value="java.version" />
	</bean>

	<!-- 3. Inject the result into javaUtils bean -->
	<bean id="javaUtils"
		class="com.mkyong.web.JavaUtils">
		<property name="javaVersion" ref="javaVersion" />
	</bean>


package com.mkyong.web;

public class JavaUtils {

	String javaVersion;

	public String getJavaVersion() {
		return javaVersion;
	}

	public void setJavaVersion(String javaVersion) {
		this.javaVersion = javaVersion;
	}

}

1.2 Java equivalent.


	System.getProperties().getProperty("java.version")

2. MethodInvokingBean

Spring 4 introduced a new MethodInvokingBean to do the same thing, just without return any value.

2.1 Java code, a bit long, but it works.


  public void startDBM() {
	MethodInvokingBean mBean = new MethodInvokingBean();

	mBean.setTargetClass(DatabaseManagerSwing.class);
	mBean.setTargetMethod("main");
	String[] args = new String[] { "--url", "jdbc:hsqldb:mem:testdb", "--user", "sa", "--password", "" };
	mBean.setArguments(args);
	try {
		mBean.prepare();
		mBean.invoke();
	} catch (Exception e) {
		e.printStackTrace();
	}		
  }

2.2 The MethodInvokingBean is good at XML configuration, but not in Java code, you can do the same thing with just one line of code.


  public void startDBM() {
	DatabaseManagerSwing.main(
		new String[] { "--url", "jdbc:hsqldb:mem:testdb", "--user", "sa", "--password", "" });
  }

2.3 XML example, show you how to pass a String [] array argument to MethodInvokingBean


	<bean class="org.springframework.beans.factory.config.MethodInvokingBean">
		<property name="targetClass" value="org.hsqldb.util.DatabaseManagerSwing" />
		<property name="targetMethod" value="main" />
		<property name="arguments">
			<list>
				<value>--url</value>
				<value>jdbc:derby:memory:dataSource</value>
				<value>--user</value>
				<value>sa</value>
				<value>--password</value>
				<value></value>
			</list>
		</property>
	</bean>

References

  1. MethodInvokingFactoryBean JavaDoc
  2. MethodInvokingBean JavaDoc

About Author

author image
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

Subscribe
Notify of
3 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
Prateek
1 year ago

Could you please share the complete source code?

MFC
6 years ago

What if I have a list of arguments? And could that list of arguments combine values and bean references? (“value” and “ref”).

Trinadh
4 years ago
Reply to  MFC

If list of arguments u pass if u have single static variable it will return expection saying failed to instantiate bean