最近遇到一個問題,寫了一個定時任務類,這個類繼承了Timetask,需要在這個定時任務類中注入一個XXXService。
最開始我是這樣寫的:
public class AutoSingleXmYckbTask extends TimerTask {
private XxxxService xxxxService;
private String xx;
public AutoSingleXmYckbTask(String xx){
this.xx=xx;
}
public void run() {
try{
xxxxService.updateXxxx(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}
結果,代碼執(zhí)行后報了空指針異常,xxxxService = null;
后來查了一下,說在普通類中使用@Autowired,需要在類上加@Component,然后我就在類上加了@Component,結果加完了這個注解后,構造方法的參數報錯了(具體原因有待分析,以后補充)如下:
public class AutoSingleXxxxTask extends TimerTask {
private XxxxService xxxxService;
private String xx;
//加了@Component,這個構造方法的參數xx報錯了
public AutoSingleXxxxTask(String xx){
this.xx=xx;
}
public void run() {
try{
xxxxService.updateXxxx(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}
最終的解決辦法
使用外部注入解決了這個問題,具體代碼如下:
1.這個定時任務類的代碼,給xxxxService設置了geter,seter方法
public class AutoSingleXxxxTask extends TimerTask {
private XxxxService xxxxService;
public XxxxService getXxxxService() {
return xxxxService;
}
public void setXxxxService(XxxxService xxxxService) {
this.xxxxService = xxxxService;
}
private String xx;
public AutoSingleXxxxTask(String xx){
this.xx=xx;
}
public void run() {
try{
xxxxService.updateAutoXxxxZt(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}
2.因為調用這個定時任務類的地方,是另一個Service類,在這個Service類中可以正常使用@Autowired注入定時任務類XxxxService,所以可以在調用這個類的時候,把xxxxService,用setXxxxService注入到類中。代碼如下
public class XxxxServiceImpl implements XxxxService {
//在這個調用那個定時任務類的類里,可以正常使用@Autowired注入xxxxService
private XxxxService xxxxService;
public void saveXxxx(Xxxx xxxx){
Timer timer = new Timer(true);
Date time = DateUtil.transfer2Date(xxxx.getxxsj());
//new一個定時任務類對象
AutoSingleXxxxTask autoSinglexxxxTask = new AutoSingleXxxxTask(xxxx.getxx());
//把xxxxService,set進定時任務類中,就可以正常使用了
autoSingleXxxxTask.setXxxxService(xxxxService);
timer.schedule(autoSingleXxxxTask, time);
}
}
本文摘自 :https://blog.51cto.com/u