Spring监听器:
- 自定义SpringApplicationRunListener来监听事件;
1.1 编写SpringApplicationRunListener 实现类
1.2 在 META-INF/spring.factories 中配置 org.springframework.boot.SpringApplicationRunListener=自己的Listener,还可以指定一个有参构造器,接受两个参数(SpringApplication application, String[] args)
执行流程解释
Listener先要从 META-INF/spring.factories 读到
1、引导:
利用 BootstrapContext 引导整个项目启动
starting: 应用开始,SpringApplication的run方法一调用,只要有了 BootstrapContext 就执行
environmentPrepared: 环境准备好(把启动参数等绑定到环境变量中),但是ioc还没有创建;【调一次】
2、启动:
contextPrepared: ioc容器创建并准备好,但是sources(主配置类)没加载。并关闭引导上下文;组件都没创建 【调一次】
contextLoaded: ioc容器加载。主配置类加载进去了。但是ioc容器还没刷新(我们的bean没创建)。
=======截止以前,ioc容器里面还没造bean呢=======
started: ioc容器刷新了(所有bean造好了),但是 runner 没调用。
ready: ioc容器刷新了(所有bean造好了),所有 runner 调用完了。
3、运行
以前步骤都正确执行,代表容器running。

各种回调监听器
●BootstrapRegistryInitializer: 感知特定阶段:感知引导初始化
○META-INF/spring.factories
○创建引导上下文bootstrapContext的时候触发。
○application.addBootstrapRegistryInitializer();
○场景:进行密钥校对授权。
●ApplicationContextInitializer: 感知特定阶段: 感知ioc容器初始化
○META-INF/spring.factories
○application.addInitializers();
●ApplicationListener: 感知全阶段:基于事件机制,感知事件。 一旦到了哪个阶段可以做别的事
○@Bean或@EventListener: 事件驱动
○SpringApplication.addListeners(…)或 SpringApplicationBuilder.listeners(…)
○META-INF/spring.factories
●SpringApplicationRunListener: 感知全阶段生命周期 + 各种阶段都能自定义操作; 功能更完善。
○META-INF/spring.factories
●ApplicationRunner: 感知特定阶段:感知应用就绪Ready。卡死应用,就不会就绪
○@Bean
●CommandLineRunner: 感知特定阶段:感知应用就绪Ready。卡死应用,就不会就绪
○@Bean
最佳实战:
●如果项目启动前做事: BootstrapRegistryInitializer 和 ApplicationContextInitializer
●如果想要在项目启动完成后做事:ApplicationRunner和 CommandLineRunner
●如果要干涉生命周期做事:SpringApplicationRunListener
●如果想要用事件机制:ApplicationListener
完整触发流程
9大事件触发顺序&时机
1ApplicationStartingEvent:应用启动但未做任何事情, 除过注册listeners and initializers.
2ApplicationEnvironmentPreparedEvent: Environment 准备好,但context 未创建.
3ApplicationContextInitializedEvent: ApplicationContext 准备好,ApplicationContextInitializers 调用,但是任何bean未加载
4ApplicationPreparedEvent: 容器刷新之前,bean定义信息加载
5ApplicationStartedEvent: 容器刷新完成, runner未调用
=========以下就开始插入了探针机制============
6AvailabilityChangeEvent: LivenessState.CORRECT应用存活; 存活探针
7ApplicationReadyEvent: 任何runner被调用
8AvailabilityChangeEvent:ReadinessState.ACCEPTING_TRAFFIC就绪探针,可以接请求
9 ApplicationFailedEvent :启动出错

Comments | NOTHING