JAVA-Spring:如何在循环中创建bean?

时间:2016-06-09 20:31:34

标签: java spring

我是春天新手,必须在整个项目中使用弹簧注释。我需要创建一个bean列表。我没有选择在我必须创建列表的类中使用context.getBean(" ..")。

问题是: 我有3个类:处理器,读卡器,写作器。我必须在处理器类中创建一个编写器列表。

这就是我要找的:(尝试@A​​utowire' 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);
    }

}

这可能吗?请告诉我一个不同的注释方法。

由于

2 个答案:

答案 0 :(得分:1)

当您使用像Spring这样的IoC框架时,您将bean创建的任务留给Spring。所以你不应该使用new关键字,这是Spring自动生成的。

相反,你应该通过context.getBean(&#34; beanname&#34;)或者获取你的bean  用@autowired注入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 :(得分:-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;
}

由于读取器和编写器bean的范围都是Prototype,因此您将获得一个新的bean实例。