@EnableScheduling
@Configuration
@Slf4j
public class Myjob implements ApplicationRunner,ApplicationListener,InitializingBean {
// 线程安全
public AtomicReference<Map<String, Object>> mapAtomicReference = new AtomicReference<>();
// 顺序 PostConstruct-->InitializingBean-->onApplicationEvent(执行多次,不建议使用)-->run
//3.添加定时任务
@Scheduled(cron = "0 0/1 * * * ?")
public void configureTasks() {
log.info("我是定时任务的数据 " + LocalDateTime.now());
}
// 定时任务
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("run--我是启动加载的数据 " + LocalDateTime.now());
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "定时任务");
}
});
loadConfig();
// scheduleAtFixedRate:是以period为间隔来执行任务的,如果任务执行时间小于period,则上次任务执行完成后会间隔period后再去执行下一次任务;但如果任务执行时间大于period,则上次任务执行完毕后会不间隔的立即开始下次任务
scheduledThreadPoolExecutor.scheduleAtFixedRate(this::loadConfig,10,10, TimeUnit.SECONDS);
// scheduleWithFixedDelay 是不管任务执行多久,都会等上一次任务执行完毕后再延迟delay后去执行下次任务
scheduledThreadPoolExecutor.scheduleWithFixedDelay(this::loadConfig,10,10, TimeUnit.SECONDS);
}
@PostConstruct
public void load(){
log.info("PostConstruct--我是启动加载的数据 " + LocalDateTime.now());
}
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
log.info("onApplicationEvent--我是启动加载的数据 " + LocalDateTime.now());
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("InitializingBean--我是启动加载的数据 " + LocalDateTime.now());
}
public void loadConfig(){
// 加载的配置配置项
mapAtomicReference.set(new HashMap<>());
log.info("loadConfig--定时任务" );
}
}
1.springboot服务启动,bean初始化调用的方法,
实现了一系列aware接口的,比如BeanNameAware,ApplicationContextAware,调用其set方法
BeanPostProcessor的postProcessBeforeInitialization方法
@PostConstruct
InitializingBean:每一个Bean实例初始化完成之后进行调用afterPropertiesSet
SmartInitializingSingleton :每一个非惰性单实例Bean实例初始化完成之后进行调用 afterSingletonsInstantiated
SmartLifecycle 在容器所有bean加载和初始化完毕执行 bean的初始化方法和销毁方法是Bean生命周期级别的;而Lifecycle是容器生命周期级别的。
ApplicationRunner: spring容器启动完成之后,就会紧接着执行这个接口实现类的run方法。
ApplicationListener:可以监听某个事件event