簡體   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