multithreading - 在运行线程中 Autowiring 或注入(inject) Bean

标签 multithreading spring dependency-injection spring-boot autowired

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

    @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 注入(inject)或 Autowiring 到消费者或生产者中时,它变为空。

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

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

最佳答案

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

将共享队列定义为一个Spring bean,在消费者和生产者中注入(inject)共享队列,在ProducerConsumer中注入(inject)消费者和生产者。

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

关于multithreading - 在运行线程中 Autowiring 或注入(inject) Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32363190/

相关文章:

spring - Jenkins 正在用它的系统属性更新我的 applicationContext.xml 文件?

java - 使用 Jersey 2.0,如何为每个请求注册一个可绑定(bind)实例?

spring - 为什么 hibernate 实体图获取嵌套的惰性集合

java - 为什么响应实体返回带有 setter/getter 名称而不是数据成员名称的 json

asp.net-mvc - 在 ASP.NET MVC 中将引用数据加载到 View 模型中的可靠方法

java - Spring MVC 中如何使用 IoC 和 DI

objective-c - Grand Central Dispatch vs NSThreads?

linux - 在 Linux 中上下文切换需要多长时间?

c++ - 如何将接口(interface)指针传递给线程?

javascript - 使用 IFRAME 是否可以实现 javascript 多线程