最近遇到一个问题,写了一个定时任务类,这个类继承了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();
}
}
}
结果,代码执行后报了空指针异常,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