一、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修饰;
只会执行一次。