我是春天新手,必须在整个项目中使用弹簧注释。我需要创建一个bean列表。我没有选择在我必须创建列表的类中使用context.getBean(" ..")。
问题是: 我有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);
}
}
这可能吗?请告诉我一个不同的注释方法。
由于
答案 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实例。