`
kamuikyo
  • 浏览: 28865 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Spring MethodInvoker

    博客分类:
  • Java
 
阅读更多

直观的说,如果想通过字符串的配置来调用一个方法;那可以使用spring提供的 MethodInvoker这个对象

示例

 

package test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.MethodInvoker;

public class AMethodClass {
	
	public static String execute(String str) {
		return str.concat("-result");
	}
	
	public String execute2(String str) {
		return str.concat("-result2");
	}
	
	public static void main(String[] args) {
		BeanFactory beanfactory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		
		/*
		 * 注意看配置文件
		 * 获取配置的MethodInvoker;这个bean配置的是targetClass,要求targetMethod必须是静态方法
		 * */
		MethodInvoker method = (MethodInvoker) beanfactory.getBean("aMethod");
		//下来可以自己手工设置方法参数
		Object[] arguments = new Object[1];
		arguments[0] = "test";
		method.setArguments(arguments);
		try {
			// 准备方法
			method.prepare();
			//执行方法
			Object result = method.invoke();
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		/*
		 * 注意看配置文件
		 * 获取配置的MethodInvoker;这个bean配置的是targetObject,则需要先配置一个bean,这里ref到这个bean
		 * targetMethod可以不是静态的
		 * */
		MethodInvoker method2 = (MethodInvoker) beanfactory.getBean("aMethod2");
		//下来可以自己手工设置方法参数
		Object[] arguments2 = new Object[1];
		arguments2[0] = "test2";
		method2.setArguments(arguments2);
		try {
			// 准备方法
			method2.prepare();
			//执行方法
			Object result = method2.invoke();
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}
 

spring配置

 

<bean id="aMethod" class="org.springframework.util.MethodInvoker">
	<property name="targetClass" value="test.AMethodClass" />
	<property name="targetMethod" value="execute" />
</bean>

<bean id="aMethod2Class" class="test.AMethodClass" />
<bean id="aMethod2" class="org.springframework.util.MethodInvoker">
	<property name="targetObject" ref="aMethod2Class" />
	<property name="targetMethod" value="execute2" />
</bean>

 

 

但一般情况不直接使用MethodInvoker;而是使用MethodInvokingFactoryBean,具体可参看这2个类的javadoc

示例

 

package test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.MethodInvoker;

public class AMethodClass {
	
	public static String execute(String str) {
		return str.concat("-result");
	}
	
	public String execute2(String str) {
		return str.concat("-result2");
	}
	
	public static void main(String[] args) {
		BeanFactory beanfactory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		
		
		/*
		 * 使用MethodInvokingFactoryBean;相当于spring帮你做了上述逻辑;
		 * 可以直接获取到方法的执行结果;
		 * 注意这里是方法的返回值;而不是class本身;这是由于MethodInvokingFactoryBean实现了FactoryBean接口;
		 * 由接口方法getObject()来获取最终返回的对象
		 */
		Object aMethod3 = beanfactory.getBean("aMethod3");
		System.out.println(aMethod3);
		
	}

}
 

 

spring配置

 

<bean id="aMethod3" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
	<property name="targetClass">
		<value>test.AMethodClass</value>
	</property>
	<property name="targetMethod">
		<value>execute</value>
	</property>
	<property name="arguments">
		<list>
			<value>test3</value>
		</list>
	</property>
</bean>
 

 

 

 

分享到:
评论
1 楼 happy.future 2014-03-11  
感谢你的分享,我参考了你的文章http://www.daniel-journey.com/archives/1156

相关推荐

    SPRING API 2.0.CHM

    MethodInvoker MethodInvokingFactoryBean MethodInvokingJobDetailFactoryBean MethodInvokingJobDetailFactoryBean.MethodInvokingJob MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob ...

    c#多线程操作

    在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高性能的应用程序。本资源包含的是C#多线程操作的范例,旨在帮助开发者理解并掌握多线程编程的关键概念和...

    C#用了多线程界面卡死

    MethodInvoker mi = new MethodInvoker(RunsOnWorkerThread); mi.BeginInvoke(null, null); // 不会阻塞UI线程 } private void RunsOnWorkerThread() { DoSomethingSlow(); } ``` 2. **避免在非UI线程中...

    在winform下使初始化速度慢的数据可以在窗体显示之后再加载,这样就能提高用户体验

    对于调用费时的步骤,可以将其延后到窗体显示之后再加载。使用方法: new DelayLoading(this, new MethodInvoker(DataBind)).Execute();

    C#多线程不阻塞[参照].pdf

    MethodInvoker simpleDelegate = new MethodInvoker(Foo); // Calling Foo simpleDelegate.Invoke(); ``` 然而,即使我们使用了委托,调用线程仍需要等待Invoke()函数来完成,直至该控件将返回到调用的线程。 ...

    C#线程通信

    本篇将详细讲解如何在子线程中安全地访问UI线程的控件,主要涉及`MethodInvoker`和`Invoke`方法。 1. **线程基础知识**: - **主线程与UI线程**:Windows Forms或WPF应用程序通常有一个主线程,负责创建并维护UI...

    c#写的浏览器可以看源代码

    c#写的浏览器可以看源代码 public void NewNullTabPages() //新建空白页面的方法 ... MethodInvoker mi = new MethodInvoker(this.NewNullTabPages); this.BeginInvoke(mi); Thread.Sleep(20); }

    C#-WinForm跨线程修改UI界面的实例

    `Task`是.NET Framework中的一个类,用于表示异步操作,而`MethodInvoker`是一个委托类型,可以用于无参数的方法,使其能在其他线程上执行。 首先,我们需要创建一个`Task`来执行后台任务。后台任务可能是一个长...

    C# winfrom 带参数与无参数的线程(可更新界面UI)

    在C# WinForm应用开发中,线程的使用是至关重要的,特别是在处理耗时操作时,为了保持用户界面(UI)的响应性,我们通常会使用多线程技术。本主题将详细探讨如何创建带参数和无参数的线程,以及如何在这些线程中安全地...

    c#跨线程间控件调用

    通过上述代码可以看出,`ISynchronizeInvoke` 接口提供了一个更灵活的方式来同步控件的调用,而 `MethodInvoker` 则简化了委托的创建过程。 #### 结论 跨线程调用控件是C# GUI编程中常见但又容易忽视的问题。正确...

    电脑分屏控制.docx

    在本文所示的代码中,使用了Thread和MethodInvoker来实现屏幕的控制。Thread是.NET Framework提供的多线程编程类,用于实现多线程编程;MethodInvoker是.NET Framework提供的委托类,用于实现方法的调用。 ...

    C#窗体多线程资料.pdf

    MethodInvoker workDelegate = new MethodInvoker(DoLongRunningTask); // 使用BeginInvoke异步调用工作方法 Invoke(workDelegate); } private void DoLongRunningTask() { // 这里执行耗时任务 } ``` 然而...

    在多线程中如何调用Winform.pdf

    MethodInvoker invoker = new MethodInvoker(form.Close); synchronizer.Invoke(invoker, null); } else { form.Close(); } ``` 在这个例子中,`synchronizer`是一个实现了`ISynchronizeInvoke`接口的对象,这里...

    C#异步调用的好处和方法

    MethodInvoker mi = new MethodInvoker(RunsOnWorkerThread); await Task.Run(() =&gt; mi.BeginInvoke(null, null)); // 不会阻塞UI线程 } private void RunsOnWorkerThread() { DoSomethingSlow(); // 在...

    C#中跨线程访问控件问题解决方案[文].pdf

    例如,使用`MethodInvoker`可以简化代码,`MethodInvoker`是.NET Framework提供的一种无参数的委托类型,适用于更新UI控件。在提供的另一个示例中,`btnOK_Click`事件处理程序启动新线程,新线程中的`threadRun`方法...

    C#多线程函数如何传参数和返回值[归类].pdf

    在线程的方法中,可以使用BeginInvoke 方法来调用UpdateUI 方法,例如,MethodInvoker mi = new MethodInvoker( this.UpdateUI ); this.BeginInvoke( mi ); 在实际应用中,需要根据具体情况来选择适合的方法来传递...

    C_多线程函数如何传参数和返回值[文].pdf

    `MethodInvoker`用于无参数的方法,而`EventHandler`通常用于事件处理,它接受一个`object`和`EventArgs`参数。尽管它们简化了代码,但在需要自定义参数和返回值时可能不够灵活。 在多线程和UI交互中,正确使用委托...

    C#多线程调用Winform窗体[文].pdf

    MethodInvoker invoker = new MethodInvoker(form.Close); synchronizer.Invoke(invoker, null); } else { form.Close(); } ``` ISynchronizeInvoke不仅限于Winform窗体,任何需要在特定线程中执行操作的类都...

    理解C#中的Lambda表达式

    ` 实际上是等价于 `MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });` 的,因为编译器会生成一个内部匿名方法来调用`MyFunc`。 5. **Lambda表达式与LINQ** Lambda表达式在LINQ中起到了关键...

    c#登录等待窗体

    this.Invoke((MethodInvoker)delegate { waitingForm.Close(); MessageBox.Show("登录成功"); }); } else { this.Invoke((MethodInvoker)delegate { waitingForm.Close(); MessageBox.Show("登录失败");...

Global site tag (gtag.js) - Google Analytics