繁体   English   中英

在运行线程中自动装配或注入Bean

[英]Autowire or Inject Bean in Running thread

我正在运行一个Spring Boot应用程序,已经在我的App config类中进行了配置:

    @Bean
public ThreadPoolTaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
    pool.setCorePoolSize(5);
    pool.setMaxPoolSize(10);
    pool.setWaitForTasksToCompleteOnShutdown(true);
    return pool;
}

我用TaskExecutor通过以下方式创建线程:

@Configuration
public class ProducerConsumer {
@Inject
TaskExecutor taskExecutor;


    Producer producer = new Producer(sharedQueue);
    Consumer consumer = new Consumer(sharedQueue);

    taskExecutor.execute(producer);
    taskExecutor.execute(consumer);

生产者和消费者,这两个类都实现了Runnable。 我的线程按预期工作,但是当我尝试将Bean注入或自动装配到Consumer或Producer中时,它为空。

@Component
public class Consumer implements Runnable {

@Autowired
SomeController someController;

public Consumer (BlockingQueue<String> sharedQueue) {
    this.sharedQueue = sharedQueue;
}

@Override
public void run() {
    while (true) {
        synchronized (sharedQueue) {
            //someController is null
            someController.someMethod();

如何将线程公开给应用程序上下文,以便可以将其他任何依赖项注入线程中?

它们之所以为空,是因为您使用Spring的new ,辛辛苦苦构造了它们自己构造了它们。 如果您自己构造对象,Spring不会意识到它,因此无法自动装配任何东西。 构造的对象只是常规对象,而不是Spring bean。

将共享队列定义为Spring Bean,将共享队列注入使用者和生产者中,并将消费者和生产者注入ProducerConsumer中。

或将SomeController注入ProducerConsumer中,并将其作为参数传递给Consumer和Producer的构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM