一、SpringBoot使用定時器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
被@PostContruct修飾的方法在@AutoWired注入容器後運行;
除了攔截器之外,被@PostContruct修飾的方法不能帶參數,返回值是void;
一個類只能有一個方法被@PostContruct修飾;
只會執行一次。