在java的spring框架中,用Timer和TimerTask来实现定时任务,有时我们要在TimerTask的子类的重写run方法里,调用service层的方法。
但是不管是spring.xml配置的bean还是注解@autoware注入的bean,在执行的时候都会报空指针异常。
刚开始的代码:
代码一:TimerTask的子类
public class AbcTask extends TimerTask { private AaaService aaaService; public void setAaaService(AaaService aaaService) { this.aaaService = aaaService; } @override public void run() { aaaService.delectSomething(); } }
代码二:Timer.schedule()的调用类
public class Scheduler { public void timer0() {
Timer timer = new Timer();
t.schedule(new AbcTask(), 0, 1000 * 60 * 60 *24); } }
代码三:spring.xml
<bean id="abcTask" class="...AbcTask" /> <bean id="scheduler" clas="...Scheduler" init-method="timer0" />
问题:TimerTask不是由spring管理的,所以 TimerTask 内部的 service 也无法自动注入。
解决:在spring的xml里,配置TimerTask bean对象,把它交由spring管理; 再把这个bean作为scheduler 的传入参数。
修改过后的代码如下:
代码二:Timer.schedule()的调用类
public class Scheduler { private AbcTask abcTask; public void setAbcTask(AbcTask abcTask) { this.abcTask = abcTask; public void timer0() { Timer t = new Timer(); t.schedule(abcTask, 0, 1000 * 60 * 60 *24);
}
}
代码三:spring.xml
<bean id="abcTask" class="...AbcTask" /> <bean id="scheduler" clas="...Scheduler" init-method="timer0"> <property name="abcTask" ref="abcTask"/> </bean>
记一点:遵循 spring 管理的前提下,一定是不能 new 对象的。