在Spring的Taskexecutor中将参数传递给runnable类

时间:2011-12-02 19:47:51

标签: spring

我很难理解如何使用Taskexecutor连接所有部件。 我有一个创建的任务,BidProposalTask​​。 (实现Runnable的类) 任务构造器有一个参数,需要自动装配以进行数据库访问等。

我想出了执行者类的代码:

public class ExecuteBidProposalTask {

    private TaskExecutor taskExecutor;
    private BidProposalTask bidProposalTask;

    public ExecuteBidProposalTask(TaskExecutor taskExecutor,
        BidProposalTask bidProposalTask) {
    super();
    this.taskExecutor = taskExecutor;
    this.bidProposalTask = bidProposalTask;
    }

    public void start() {
    taskExecutor.execute(bidProposalTask);
    }

}

以及以下XML上下文配置:

<bean id="taskExecutor"
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="5" />
    <property name="maxPoolSize" value="10" />
    <property name="queueCapacity" value="25" />
</bean>
正如我在Spring的文档中看到的那样,我创建了一个TaskExecutor bean,但问题是还需要注入BidProposalTask​​。它不是单例,我需要在项目中反复创建它,并为构造函数添加不同的参数。

基本上问题是如何自动装配非单例bean,所以它的自动装配也会有用吗?

解释起来相当复杂,所以我希望你理解我的问题......

1 个答案:

答案 0 :(得分:4)

您可以创建ExecuteBidProposalTask类ApplicationContextAware(主要是将应用程序上下文注入bean)。然后,您可以在上下文文件中声明BidProposalTask​​ bean并生成scope="prototype"。然后在start中的ExecuteBidProposalTask方法中,您可以执行:context.getBean("bidProposalTask");并将其传递给执行者。由于您将范围声明为原型,因此在您请求bean时将构造并返回一个新实例(不是单例)。