在 运行 线程中自动装配或注入 Bean
Autowire or Inject Bean in Running thread
我是 运行 一个 Spring 启动应用程序,我已在我的应用程序配置中配置 class:
@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);
生产者和消费者,class都实现了 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();
如何将我的线程暴露给应用程序上下文,以便我可以将任何其他依赖项注入我的线程?
它们是空的,因为你自己构造它们,使用 new
,让 Spring 构造它们。如果你自己构造一个对象,Spring 不会意识到它,因此不能自动装配任何东西。构造的对象只是常规对象,而不是 Spring beans。
将共享队列定义为Springbean,在消费者和生产者中注入共享队列,在ProducerConsumer中注入消费者和生产者。
或者将 SomeController 注入到 ProducerConsumer 中,并将其作为参数传递给 Consumer 和 Producer 的构造函数。
我是 运行 一个 Spring 启动应用程序,我已在我的应用程序配置中配置 class:
@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);
生产者和消费者,class都实现了 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();
如何将我的线程暴露给应用程序上下文,以便我可以将任何其他依赖项注入我的线程?
它们是空的,因为你自己构造它们,使用 new
,让 Spring 构造它们。如果你自己构造一个对象,Spring 不会意识到它,因此不能自动装配任何东西。构造的对象只是常规对象,而不是 Spring beans。
将共享队列定义为Springbean,在消费者和生产者中注入共享队列,在ProducerConsumer中注入消费者和生产者。
或者将 SomeController 注入到 ProducerConsumer 中,并将其作为参数传递给 Consumer 和 Producer 的构造函数。