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修饰;

只会执行一次。

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