2016-06-09 2 views
0

Я новичок в весне и должен использовать весенние аннотации по всему проекту. Мне нужно создать список бобов. У меня нет возможности использовать context.getBean ("..") из класса, где мне нужно создать список.JAVA-Spring: Как создать бобы в петле?

Проблема: У меня есть 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(); 
    } 

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

} 

} 

класс чтения выглядит следующим образом:

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

Когда вы используете среду IoC, такую ​​как Spring, вы оставляете задачу создания bean-компонента Spring. Поэтому вы не должны использовать новое ключевое слово, это автоматически создается Spring.

Вместо этого вы должны получить свои бобы через context.getBean («beanname») или , впрыскивая bean-компонент с @autowired.

Здесь есть пример или 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 
{ 

не является хорошей идеей, потому что вы не распространяющие поведение резьбы. Вместо того, чтобы сделать его

public class RoxourReader implements Runnable 
{ 

и при использовании ключевого слова new создать объект, то весна не на самом деле управлять им.

Меняем линий

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 как для чтения, так и для писателя, вы получите новый экземпляр bean.

+1

Наверное, лучше всего в качестве комментария. – Makoto

+0

@ Макото, я все еще редактировал ответ. Вы все еще думаете, что это хорошо, как комментарий? – K139

Смежные вопросы