SpringBoot 使用Timer定時器及問題總結

一、SpringBoot使用定時器Timer

參考博客:Java定時器Timer學習之一

首先需要一個類繼承java.util.TimerTask,重寫run方法,在run方法裏面實現定時任務。

import java.util.TimerTask;

@Slf4j
@Component
public class TestTimerTaskUtils extends TimerTask {
    @Autowired
    UUserService userService;

    @Override
    public void run() {
		//定時任務
        log.info("開始更新用戶緩存");
        log.info(userService.toString());
        log.info("更新用戶列表結束");
    }
}

然後創建實例,調用裏面的run方法。因爲是SpringBoot項目,想在項目啓動時自動初始化調用定時任務,所以用了PostContruct這個註解。

import java.util.Timer;

@Component
public class TestTimerUtils {
    @Autowired
    TestTimerTaskUtils testTask;
    // TestTimerTaskUtils testTask = new TestTimerTaskUtils(); 如此testTask裏面的注入爲空,即Autowired無效
    
    @PostConstruct
    public void a() {
        testTask();
    }

    public void testTask() {
        Timer timer = new Timer();
        //第一次執行是在當前時間的兩秒之後,之後每隔一分鐘執行一次
        timer.schedule(testTask, 2000L, 60000L);
    }

}

二、總結

(1) @Autowired注入無效

參考博客:
1.SpringBoot 中@Autowired 注入失效原因及解決方法
2.new 出的對象無法使用 @Autowired裝配進來的屬性,會報null

開始時程序啓動總是報空指針的錯誤,錯誤部分如下:

如上,我在創建TestTimerTaskUtils的實例時用的是new的方式,而在TestTimerTaskUtils中UUserService是使用@Autowired注入的,所以導致了@Autowired注入無效,這時UUserService的實例爲空,所以報空指針錯誤。
就是說,new出來的實例和Spring注入的是兩個不同的對象,所以new的實例是無法調用依賴注入的實例的。

(2) 使用@PostContruct

參考文章:@PostConstruct

被@PostContruct修飾的方法在@AutoWired注入容器後運行;

除了攔截器之外,被@PostContruct修飾的方法不能帶參數,返回值是void;

一個類只能有一個方法被@PostContruct修飾;

只會執行一次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章