gpt4 book ai didi

java - Spring @Autowired 不在新线程上工作

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:03 28 4
gpt4 key购买 nike

当我运行 TaskJob 时,我收到空指针异常,因为 Spring 不会 Autowiring serviceJob 服务。新线程是否导致此问题,因为 Spring Autowiring mysqlService 没有任何问题?

public class TaskJob implements Runnable {
@Autowired
private ServiceJob serviceJob;

String name;
String source;

public TaskJob(String name, String source) {
this.name = name;
this.source = source;
}

public void run() {
serviceJob.run();
}
}

@Service
public class ServiceJob extends BaseJob{

@Autowired
private MysqlService mysqlService;

public void run(){
....
}
}

@Service
public class MysqlService {
...
}

我的applicationContext.xml;

<context:component-scan base-package="cm.*" /> 

我的类(class)是;

cm.tasks.jobs.TaskJob
cm.jobs.ServiceJob
cm.services.MysqlService;

编辑: TaskJob 实例化为;

TaskJob taskJob = new TaskJob(name, source);
Thread taskThread = new Thread(taskJob);
taskThread.start();

最佳答案

Spring 只 Autowiring 它创建的组件。您正在调用 new TaskJob(),Spring 不知道此对象,因此不会发生 Autowiring 。

作为解决方法,您可以直接调用应用程序上下文。首先获取应用程序上下文的句柄。这可以通过为应用程序上下文本身添加@Autowire 来完成。

@Autowired
private ApplicationContext applicationContext;

当您创建 TaskJob 时,请应用上下文执行您的 Autowiring 。

TaskJob taskJob = new TaskJob(name, source);
applicationContext.getAutowireCapableBeanFactory().autowireBean(taskJob);

此外,如果您有任何需要触发的 @PostConstruct 注释方法,您可以调用 initializeBean()

applicationContext.getAutowireCapableBeanFactory().initializeBean(taskJob, null);

关于java - Spring @Autowired 不在新线程上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42502362/

28 4 0
文章推荐: java - 删除文件夹及其内容 AWS S3 java
文章推荐: json - 使用 Codable 用一个结构解码两个不同的 JSON 响应
文章推荐: html - 当我在固定宽度 上使用
时,
的宽度变窄了。为什么?