Springboot⽣命周期
application.properties中增加
context.listener.classes=demo.springboot.listener.ApplicationEventListener
实现接⼝ApplicationListener
package demo.springboot.listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.t.event.ApplicationEnvironmentPreparedEvent;
import org.t.event.ApplicationPreparedEvent;
import org.t.event.ApplicationReadyEvent;
import t.ApplicationEvent;
import t.ApplicationListener;
import t.event.ContextClosedEvent;
import t.event.ContextRefreshedEvent;
import t.event.ContextStartedEvent;
import t.event.ContextStoppedEvent;
/**
* springboot ⽣命周期
* @author ardo
*/
public class ApplicationEventListener implements ApplicationListener<ApplicationEvent> {
private Logger logger = Logger(getClass());
@Override
public void onApplicationEvent(ApplicationEvent event) {
// 在这⾥可以监听到Spring Boot的⽣命周期
if(event instanceof ApplicationStartingEvent){
logger.info("应⽤程序启动中");
} else if (event instanceof ApplicationEnvironmentPreparedEvent) { // 初始化环境变量
logger.info("初始化环境变量");
} else if (event instanceof ApplicationPreparedEvent) { // 初始化环境变量完成,初始化上下⽂context完成
logger.info("初始化环境变量完成,初始化上下⽂context完成");
} else if (event instanceof ContextRefreshedEvent) { // 应⽤刷新
logger.info("应⽤刷新");
} else if (event instanceof ApplicationReadyEvent) {// 应⽤已启动完成
logger.info("应⽤已启动完成");
} else if (event instanceof ContextStartedEvent) { // 应⽤启动,Spring2.5新增的事件,当容器调⽤ConfigurableApplicationContext的 Start()⽅法开始/重新开始容器时触发该事件。 logger.info("应⽤启动好了");
} else if(event instanceof ApplicationFailedEvent){
logger.info("应⽤启动失败");
}else if (event instanceof ContextStoppedEvent) { // 应⽤停⽌,Spring2.5新增的事件,当容器调⽤ConfigurableApplicationContext 的Stop()⽅法停⽌容器时触发该事件。
logger.info("应⽤停⽌");
} else if (event instanceof ContextClosedEvent) { // 应⽤关闭,当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
logger.info("应⽤关闭");spring framework版本
} else {
logger.info("其他事件" + String());
}
}
}
ApplicationContextInitializedEvent:当 SpringApplication 启动并且准备好 ApplicationContext,并且在加载任何 bean 定义之前调⽤了ApplicationContextInitializers 时发布的事件。对应的⽣命周期⽅法是contextPrepared()。
ApplicationPreparedEvent:它是SpringBoot上下⽂ context 创建完成是发布的事件;但此时 spring 中的 bean 还没有完全初始化完成,因为后⾯还要refreshContext。这⾥可以将上下⽂传递出去做⼀些额外的操作。但是在该中是⽆法获取⾃定义 bean 并进⾏操作的。对应的⽣命周期⽅法是contextLoaded()。
ApplicationStartedEvent:这个事件是在 2.0 版本才引⼊的;具体发布是在应⽤程序上下⽂刷新之后,调⽤任何 ApplicationRunner 和CommandLineRunner 运⾏程序之前。
SpringApplicationRunListeners:是⼀个集合类,内部包含⼀个 log 和包含 SpringApplicationRunListener 的 List。⽽ SpringApplicationRunListener 主要是监听 SpringApplication 对象的,⾥⾯的⽅法都定义了在何时调⽤ SpringApplicationRunListener 的各种⽅法,它的实现类是EventPublishingRunListener。它就是⼀个ApplicationListener的代理。springboot启动的⼏个主要过程的监听通知都是通过他来进⾏回调,它的⽣命周期就是从开始启动,到启动结束。
下⾯的每⼀个⽅法 SpringApplicationRunListener 都把其包装成⼀个事件,在spring容器还未成功 refreshed 之前都是使⽤SimpleApplicationEventMulticaster 去寻对该事件感兴趣的ApplicationListener,然后调⽤其onApplicationEvent⽅法
starting:当SpringApplication对象的run⽅法刚启动的时候(依靠SimpleApplicationEventMulticaster),对应的事件:ApplicationStartingEvent environmentPrepared:在environment Prepared 但是spring容器还未创建的时候(依靠SimpleApplicationEventMulticaster),对应的事件:ApplicationPreparedEvent
contextPrepared:当spring容器已经创建且准备好了,(⽬前是空的实现),这时候environment资源还没初始化完成。
contextLoaded:当spring容器已经loaded 且未refreshContext 。这个时候environment资源也初始化完
成。load就是将我们的primaryClass注册到spring容器中,(依靠SimpleApplicationEventMulticaster)同时将之前获取到的ApplicationListener都加⼊到spring容器中,此时如果ApplicationListener还是ApplicationContextAware的也要调⽤其setApplicationContext⽅法。对应的事件:ApplicationPreparedEvent
started:spring容器已经刷新过且应⽤已经启动,但是CommandLineRunners和ApplicationRunners还未调⽤,直接通过spring容器⾃⼰发送(因为ApplicationListener已经加⼊spring容器),对应的事件:ContextStartedEvent
running:我们已经调⽤了CommandLineRunners,直接通过spring容器⾃⼰发送(因为ApplicationListener已经加⼊spring容器),对应的事件:ApplicationReadEvent
failed:当异常发⽣的时候就调⽤这个,如果spring容器没有loaded 或者没有激活就使⽤SimpleApplicationEventMulticaster,否则还是依靠spring容器⾃⼰。对应该事件:ApplicationFailedEvent
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论