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 對象的。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM