當前位置:首頁 > IT技術 > Web編程 > 正文

繼承timetask的類使用@Autowired注入為null,類加了@component構成方法參數(shù)報錯
2021-10-20 10:28:46

最近遇到一個問題,寫了一個定時任務類,這個類繼承了Timetask,需要在這個定時任務類中注入一個XXXService。

最開始我是這樣寫的:

public class AutoSingleXmYckbTask extends TimerTask {
@Autowired
private XxxxService xxxxService;

private String xx;

public AutoSingleXmYckbTask(String xx){
this.xx=xx;
}
@Override
public void run() {
try{
xxxxService.updateXxxx(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}


結果,代碼執(zhí)行后報了空指針異常,xxxxService = null;

后來查了一下,說在普通類中使用@Autowired,需要在類上加@Component,然后我就在類上加了@Component,結果加完了這個注解后,構造方法的參數(shù)報錯了(具體原因有待分析,以后補充)如下:

@Component
public class AutoSingleXxxxTask extends TimerTask {
@Autowired
private XxxxService xxxxService;

private String xx;
//加了@Component,這個構造方法的參數(shù)xx報錯了
public AutoSingleXxxxTask(String xx){
this.xx=xx;
}
@Override
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;
}

@Override
public void run() {
try{
xxxxService.updateAutoXxxxZt(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}

2.因為調用這個定時任務類的地方,是另一個Service類,在這個Service類中可以正常使用@Autowired注入定時任務類XxxxService,所以可以在調用這個類的時候,把xxxxService,用setXxxxService注入到類中。代碼如下

@Service
public class XxxxServiceImpl implements XxxxService {
@Autowired//在這個調用那個定時任務類的類里,可以正常使用@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

開通會員,享受整站包年服務立即開通 >