1. ApplicationStartingEvent
	•	触发时机：Spring 应用启动开始时（SpringApplication.run() 调用后但尚未完成配置）。
	•	特点：
	•	此时 Spring 上下文还未创建。
	•	仅能访问 SpringApplication 和命令行参数。
	•	通常用于初始化一些早期的全局资源。
2. ApplicationEnvironmentPreparedEvent
	•	触发时机：Environment 准备完成后，但上下文尚未创建。
	•	特点：
	•	配置文件已加载，Environment 对象已初始化。
	•	可以在此阶段修改环境变量（如动态设置配置属性）。
	•	典型用途：根据环境配置动态修改属性或初始化全局配置。
3. ApplicationContextInitializedEvent
	•	触发时机：上下文创建后，ApplicationContextInitializer 被调用。
	•	特点：
	•	上下文已存在但尚未刷新。
	•	用于对 ConfigurableApplicationContext 进行自定义。
4. ApplicationPreparedEvent
	•	触发时机：上下文已准备好，但尚未刷新（即还未加载所有 Bean）。
	•	特点：
	•	可以在此时添加一些特殊的 Bean 定义。
	•	常用于执行一些依赖于上下文的预初始化逻辑。
5. ApplicationStartedEvent
	•	触发时机：上下文刷新完成，Spring Boot 启动完成，但还未运行任何 CommandLineRunner 或 ApplicationRunner。
	•	特点：
	•	此时应用已经可以接收 HTTP 请求。
	•	常用于记录应用成功启动或通知其他系统。
6. ApplicationReadyEvent
	•	触发时机：所有初始化完成，CommandLineRunner 和 ApplicationRunner 已执行。
	•	特点：
	•	表示应用已经完全启动并处于可用状态。
	•	常用于触发某些需要在应用完全启动后执行的操作。
7. ApplicationFailedEvent
	•	触发时机：应用启动过程中发生异常。
	•	特点：
	•	此事件可以捕获启动中的任何错误。
	•	常用于记录启动失败日志或清理资源。
8.	ApplicationStoppingEvent
	•	应用正在停止时触发。
	•	Spring Boot 2.5 引入。
	•	使用场景： 资源清理、日志记录等。
注意事项：
	•	事件监听器的注册方式：
	•	编程注册： 使用 SpringApplication.addListeners() 添加监听器。
	•	spring.factories： 在 META-INF/spring.factories 文件中声明。
	•	@Component： 实现 ApplicationListener 接口并注入 Spring 容器。
	•	事件传播机制：
	•	事件广播通过 ApplicationEventMulticaster 进行。
	•	对事件的优先级控制：
	•	可以实现 Ordered 接口或者使用 @Order 注解来控制多个监听器的执行顺序。