在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 对象的。