Springboot核心:生命周期监听

发布于 2023-09-22  1225 次阅读


Spring监听器:

  1. 自定义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 :启动出错


欢迎欢迎~热烈欢迎~