在多執行緒中注入spring物件
阿新 • • 發佈:2019-01-09
以前一般很少用多執行緒處理些問題,今天遇到一個問題,在kafka的消費端,我是啟的多執行緒去消費kafka的資料,其中在多執行緒的業務程式碼中注入了server層的物件,但是在實際執行的時候卻發現注入不了,然後檢查spring的xml 包掃描的配置,發現配置沒有問題,後面才發現在多執行緒的執行緒內部不能注入spring容器所管理的物件,細想一下: 應該是因為在web容器啟動的時候,spring並不能感知還未執行的執行緒中的物件注入.
然後換了一種思路,就是在開啟執行緒之前在main執行緒中先注入server層的物件,然後在執行執行緒的時候把該物件作為引數傳入到執行緒內部執行,前提是這個物件必須是無狀態的或者說是執行緒安全的.
當然也可以使用spring的上下文去getBean()來獲取spring容器中的物件。
主執行緒的虛擬碼如下:
@Service
public class MainClassEG {
@Autowired
private ServiceEG service;
public void methodEG {
//執行消費
for (int i = 0; i < 3; i++) {
//在這裡開啟執行緒的時候傳入spring注入的service
//如果把@Autowired註解的private ServiceEG service;寫在XxxThread執行緒類裡面,spring是不能注入的
executor.execute(new XxxThread(service,i);
}
}
}
XxxThread 執行緒的虛擬碼如下:
public class XxxThread implements Runnable {
private ServiceEg service;
private int threadFlag;
public XxxThread(ServiceEg service, int threadFlag) {
super();
this.service = service;
this .threadFlag = threadFlag;
}
public ServiceEg getService() {
return service;
}
public void setService(ServiceEg service) {
this.service = service;
}
public int getThreadFlag() {
return threadFlag;
}
public void setThreadFlag(int threadFlag) {
this.threadFlag = threadFlag;
}
@Override
public void run() {
service.doSomething(xxxx);
}
}