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