2016-06-09 48 views
0

我是春季新手,必須在項目中使用春季註釋。我需要創建一個bean列表。我沒有選擇從我必須創建列表的類中使用context.getBean(「..」)。JAVA-Spring:如何在循環中創建bean?

問題是: 我有3類:處理器,讀者,作家。我必須在處理器類中創建一個編寫器列表。

這就是我要找:(試圖@Autowire「RoxourReader readerThread」和「名單writerThreads」,但不知道如何確定列表的大小和需要添加的名稱爲好)

package company.online.Roxour.api.operation; 
{ 

@Component 
@Scope("singleton") 
public class RoxourProcessor 
{ 

    ......... 

    private int PAYLOAD_SIZE; 

    private int MAX_READER_THREADS; 
    private int MAX_WORKER_THREADS; 

    @Autowired 
    ApplicationEnvironment applicationEnvironment; 

    @Autowired 
    RoxourUtil util; 

    //I wish to have something like this 
    @Autowired 
    RoxourReader readerThread 

    //I wish to have something like this 
    @Autowired 
    List<RoxourWriter> writerThreads; 



    @PostConstruct public void initialize() 
    { 
     PAYLOAD_SIZE = applicationEnvironment.getPayloadSize(); 
     MAX_READER_THREADS = applicationEnvironment.getMaxReaderThreads(); 
     MAX_WORKER_THREADS = applicationEnvironment.getMaxWorkerThreads(); 
    } 

    .............. 

} 

} 

Reader類的樣子:

package company.online.Roxour.api.operation; 
{ 

@Component 
@Scope("prototype") 
public class RoxourReader extends Thread 
{ 

    ......... 


    @Autowired 
    ApplicationEnvironment applicationEnvironment; 


    public RoxourReader(String name) 
    { 
     this.name = name; 
    } 

    .............. 

} 


} 

和作者類的樣子:

package company.online.Roxour.api.operation; 
{ 

@Component 
@Scope("prototype") 
public class RoxourWriter extends Thread 
{ 

    ......... 


    @Autowired 
    ApplicationEnvironment applicationEnvironment; 


    public RoxourWriter(String name) 
    { 
     this.name = name; 
    } 

    .............. 

} 

} 

context.xml的有:

<!-- Scans within the base package of the application for @Components to configure as beans --> 
<context:component-scan base-package="company.online.Roxour.api"/> 

根據當前的實現,這是我們正在創建的胎面方式:

private void createAllThreads() 
{ 

    readerThread = new RoxourReader( "Reader " + 1); 


    writerThreads= new RoxourWriter[ MAX_WORKER_THREADS ]; 

    for (int i = 0; i < MAX_WORKER_THREADS; i++) 
    { 
     writerThreads[ i ] = new RoxourWriter("Uploader " + i); 
    } 

} 

這可能嗎?請另外告知我一種不同的註解方法。

感謝

回答

1

當您使用像Spring這樣的IoC框架時,將創建bean的任務留給Spring。所以你不應該使用新的關鍵字,這是由Spring自動完成的。

相反,您應該通過context.getBean(「beanname」)或 通過@autowired注入bean來獲得bean。

這裏有一個與線程的例子或Spring(有3個很好的例子) http://www.mkyong.com/spring/spring-and-java-thread-example/

而且這裏有任務執行的定義。 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

-1

首先,

public class RoxourReader extends Thread 
{ 

是不是一個好主意,因爲你沒有繼承Thread行爲。相反,讓它

public class RoxourReader implements Runnable 
{ 

,當你使用關鍵字new創建一個對象,那麼Spring是不實際管理它。

因此改變線路

new RoxourReader... & 
new RoxourWriter 

到自動裝配Autowired(或)getBeans方法,如

private void createAllThreads() 
{ 

    readerThread = getReaderBean("readerBeanName"); 


    writerThreads= new Runnable[MAX_WORKER_THREADS]; 

    for (int i = 0; i < MAX_WORKER_THREADS; i++) 
    { 
     writerThreads[ i ] = getWriterBean("Uploader " + i); 
    } 

} 

和你getBeans方法會是什麼樣子,

public Runnable getReaderBean(){ 
     Runnable obj= applicationContext.getBean("RoxourReader"); 
     return obj; 
} 


public Runnable getWriterBean(){ 
     Runnable obj= applicationContext.getBean("RoxourWriter"); 
     return obj; 
} 

由於示波器是Prototype對於reader和writer bean來說,你將得到一個新的bean實例。

+1

可能最好作爲評論。 – Makoto

+0

@Makoto,我還在編輯答案。你仍然認爲這是一個好評嗎? – K139