2011-12-02 87 views
1

我無法理解如何使用Taskexecutor連接所有部件。 我有一個我創建的任務BidProposalTask​​。 (其實現Runnable類) 任務constuctor有一個參數,並且需要自動裝配DB訪問等將參數傳遞給Spring的Taskexecutor中的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的綠豆,但是,問題是,BidProposalTask​​也需要注入。它不是一個單身人士,我需要在項目中反覆創建它,併爲構造函數提供不同的參數。

基本上問題是如何autowire一個非單身bean,所以它的自動裝配也將工作?

這是相當複雜的解釋,所以我希望你明白我的問題......

回答

4

你可以讓你的ExecuteBidProposalTask類了ApplicationContextAware(基本注入應用程序上下文到bean)。然後,您可以在您的上下文文件中聲明您的BidProposalTask​​ bean並製作scope="prototype"。然後在方法ExecuteBidProposalTask中,您可以執行:context.getBean("bidProposalTask");並將其傳遞給執行程序。由於您將範圍聲明爲原型,因此在請求bean時將構造並返回新實例(不是單例)。

+0

這聽起來很有趣,你有沒有鏈接,或者這樣的注射的例子? – stdcall

+0

這很容易。只要讓ExecuteBidProposalTask​​實現ApplicationContextAware(參見http://blog.imaginea.com/making-a-spring-bean-applicationcontext-aware/),那麼你可以從字面上調用applicationContext.getBean(「bidProposalTask​​」);並且只要bean被定義爲這樣的'你總能得到一個新的實例。 – Chris

+0

是的,但是如何爲每個bidProposalTask​​實例提供可變參數? – stdcall