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

时间:2015-09-02 21:12:18

标签: multithreading spring dependency-injection spring-boot autowired

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

    @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);

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

@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();

如何将我的线程暴露给应用程序上下文,以便我可以将任何其他依赖项注入我的线程?

1 个答案:

答案 0 :(得分:3)

它们是空的,因为你自己构造它们,使用new,而不是让Spring构造它们。如果你自己构造一个对象,Spring就不会意识到它,因此无法自动装配任何东西。构造的对象只是常规对象,而不是Spring bean。

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

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