最近遇到一個(gè)問題,寫了一個(gè)定時(shí)任務(wù)類,這個(gè)類繼承了Timetask,需要在這個(gè)定時(shí)任務(wù)類中注入一個(gè)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();
}
}
}
結(jié)果,代碼執(zhí)行后報(bào)了空指針異常,xxxxService = null;
后來(lái)查了一下,說(shuō)在普通類中使用@Autowired,需要在類上加@Component,然后我就在類上加了@Component,結(jié)果加完了這個(gè)注解后,構(gòu)造方法的參數(shù)報(bào)錯(cuò)了(具體原因有待分析,以后補(bǔ)充)如下:
public class AutoSingleXxxxTask extends TimerTask {
private XxxxService xxxxService;
private String xx;
//加了@Component,這個(gè)構(gòu)造方法的參數(shù)xx報(bào)錯(cuò)了
public AutoSingleXxxxTask(String xx){
this.xx=xx;
}
public void run() {
try{
xxxxService.updateXxxx(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}
最終的解決辦法
使用外部注入解決了這個(gè)問題,具體代碼如下:
1.這個(gè)定時(shí)任務(wù)類的代碼,給xxxxService設(shè)置了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.因?yàn)檎{(diào)用這個(gè)定時(shí)任務(wù)類的地方,是另一個(gè)Service類,在這個(gè)Service類中可以正常使用@Autowired注入定時(shí)任務(wù)類XxxxService,所以可以在調(diào)用這個(gè)類的時(shí)候,把xxxxService,用setXxxxService注入到類中。代碼如下
public class XxxxServiceImpl implements XxxxService {
//在這個(gè)調(diào)用那個(gè)定時(shí)任務(wù)類的類里,可以正常使用@Autowired注入xxxxService
private XxxxService xxxxService;
public void saveXxxx(Xxxx xxxx){
Timer timer = new Timer(true);
Date time = DateUtil.transfer2Date(xxxx.getxxsj());
//new一個(gè)定時(shí)任務(wù)類對(duì)象
AutoSingleXxxxTask autoSinglexxxxTask = new AutoSingleXxxxTask(xxxx.getxx());
//把xxxxService,set進(jìn)定時(shí)任務(wù)類中,就可以正常使用了
autoSingleXxxxTask.setXxxxService(xxxxService);
timer.schedule(autoSingleXxxxTask, time);
}
}
本文摘自 :https://blog.51cto.com/u