[英]Spring @Autowired not working on new thread
當我運行TaskJob時,我得到空指針異常,因為Spring沒有自動裝配serviceJob服務。 新線程是否導致此問題,因為Spring自動連接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.*" />
我的課程是;
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只會自動裝配它創建的組件。 你正在調用新的TaskJob(),Spring不知道這個對象所以不會發生自動裝配。
作為一種解決方法,您可以直接調用應用程序上下文。 首先了解應用程序上下文。 這可以通過為應用程序上下文本身添加@Autowire來完成。
@Autowired
private ApplicationContext applicationContext;
創建TaskJob時,請詢問應用程序上下文以進行自動連接。
TaskJob taskJob = new TaskJob(name, source);
applicationContext.getAutowireCapableBeanFactory().autowireBean(taskJob);
另外,如果你有任何@PostConstruct
注釋方法需要觸發,你可以調用initializeBean()
applicationContext.getAutowireCapableBeanFactory().initializeBean(taskJob, null);
你的TaskJob是用“new”操作符實例化的,這意味着創建的對象不是spring bean。 因此,您必須編寫代碼以使用new運算符為屬性(ServiceJob)創建對象。
使用Spring spring框架時,不會像這樣創建Service對象。 請使用Applicationcontext的getBean方法。 請看這里
請嘗試這種類型
<context:component-scan base-package="cm.*,cm.tasks.jobs" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.