TimerTask的run()方法里面如何调用service层里面的方法

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

原文地址:https://www.cnblogs.com/boomoom/p/9136557.html