當(dāng)前位置:首頁(yè) > IT技術(shù) > Web編程 > 正文

繼承timetask的類(lèi)使用@Autowired注入為null,類(lèi)加了@component構(gòu)成方法參數(shù)報(bào)錯(cuò)
2021-10-20 10:28:46

最近遇到一個(gè)問(wèn)題,寫(xiě)了一個(gè)定時(shí)任務(wù)類(lèi),這個(gè)類(lèi)繼承了Timetask,需要在這個(gè)定時(shí)任務(wù)類(lèi)中注入一個(gè)XXXService。

最開(kāi)始我是這樣寫(xiě)的:

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();
}
}
}


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

后來(lái)查了一下,說(shuō)在普通類(lèi)中使用@Autowired,需要在類(lèi)上加@Component,然后我就在類(lèi)上加了@Component,結(jié)果加完了這個(gè)注解后,構(gòu)造方法的參數(shù)報(bào)錯(cuò)了(具體原因有待分析,以后補(bǔ)充)如下:

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

private String xx;
//加了@Component,這個(gè)構(gòu)造方法的參數(shù)xx報(bào)錯(cuò)了
public AutoSingleXxxxTask(String xx){
this.xx=xx;
}
@Override
public void run() {
try{
xxxxService.updateXxxx(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}

最終的解決辦法

使用外部注入解決了這個(gè)問(wèn)題,具體代碼如下:

1.這個(gè)定時(shí)任務(wù)類(lèi)的代碼,給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;
}

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

2.因?yàn)檎{(diào)用這個(gè)定時(shí)任務(wù)類(lèi)的地方,是另一個(gè)Service類(lèi),在這個(gè)Service類(lèi)中可以正常使用@Autowired注入定時(shí)任務(wù)類(lèi)XxxxService,所以可以在調(diào)用這個(gè)類(lèi)的時(shí)候,把xxxxService,用setXxxxService注入到類(lèi)中。代碼如下

@Service
public class XxxxServiceImpl implements XxxxService {
@Autowired//在這個(gè)調(diào)用那個(gè)定時(shí)任務(wù)類(lèi)的類(lèi)里,可以正常使用@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ù)類(lèi)對(duì)象
AutoSingleXxxxTask autoSinglexxxxTask = new AutoSingleXxxxTask(xxxx.getxx());
//把xxxxService,set進(jìn)定時(shí)任務(wù)類(lèi)中,就可以正常使用了
autoSingleXxxxTask.setXxxxService(xxxxService);
timer.schedule(autoSingleXxxxTask, time);
}
}

本文摘自 :https://blog.51cto.com/u

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >