gpt4 book ai didi

java - 如何 Autowiring Spring TaskExecutor 创建的线程?

转载 作者:IT老高 更新时间:2023-10-28 13:59:00 26 4
gpt4 key购买 nike

根据Spring's documentation TaskExecutor的使用方法如下:

import org.springframework.core.task.TaskExecutor;

public class TaskExecutorExample {

private class MessagePrinterTask implements Runnable {

private String message;

public MessagePrinterTask(String message) {
this.message = message;
}

public void run() {
System.out.println(message);
}

}

private TaskExecutor taskExecutor;

public TaskExecutorExample(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}

public void printMessages() {
for(int i = 0; i < 25; i++) {
taskExecutor.execute(new MessagePrinterTask("Message" + i));
}
}
}

但是,如果 MessagePrinterTask 具有 Autowiring 的依赖关系,它们将不会由 Spring 配置,因为我们在 Spring 的上下文之外实例化我们的 bean(至少我是这样理解的),即使 Spring 将提供实际的线程创建。 如果 MessagePrinterTask 具有 Autowiring 的依赖关系,我们如何让 Spring 识别它们? 我尝试了以下修改后的示例,但无济于事(是的, Autowiring 已正确启用):

import org.springframework.core.task.TaskExecutor;

public class TaskExecutorExample {

@Component
private class MessagePrinterTask implements Runnable {

@Autowired
private autoWiredDependency;

public void run() {
autoWiredDependency.doNotThrowNullPointerExceptionPlease();
}

}

private TaskExecutor taskExecutor;

public TaskExecutorExample(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}

public void printMessages() {
for(int i = 0; i < 25; i++) {
taskExecutor.execute(new MessagePrinterTask());
}
}
}

最佳答案

我认为有两种方法可以解决这个问题:

一个。为任务提供依赖项 - 这样:

class MessagePrinterTask implements Runnable {
public MessagePrinterTask(ADependency aDependency){
this.aDependency = aDependency;
}


private ADependency aDependency;

public void run() {
aDependency.doNotThrowNullPointerExceptionPlease();
}
}

在你的 TaskExectorExample 中可以是单例:

import org.springframework.core.task.TaskExecutor;

public class TaskExecutorExample {

@Autowired private ADependency aDependency;

@Autowired
public TaskExecutorExample(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}

public void printMessages() {
for(int i = 0; i < 25; i++) {
taskExecutor.execute(new MessagePrinterTask(this.aDependency));
}
}
}

b.在您的 MesasgePrinterTask 上使用 @Configurable 注释,这将在 MessagePrinterTask 中注入(inject)依赖项,即使它是在 Spring 容器之外实例化的 - 虽然使用 @Configurable 有一些问题(需要 AspectJ):

@Configurable
class MessagePrinterTask implements Runnable {

关于java - 如何 Autowiring Spring TaskExecutor 创建的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11787313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com