Spring Boot 应用在启动时,会经历一系列的方法调用和事件发布,这些构成了 Spring Boot 应用的完整生命周期。以下是 Spring Boot 生命周期中的关键步骤、方法和事件,以及它们的作用和示例代码。

生命周期方法和事件

  1. SpringApplication.run()

    • 作用:启动整个 Spring Boot 应用。这个方法会触发应用的初始化和启动过程。
    • 示例
      java
      复制
      public static void main(String[] args) {
          SpringApplication.run(MySpringBootApplication.class, args);
      }
      
  2. ApplicationStartingEvent

    • 作用:在应用启动开始时发布。此时,只初始化了 SpringApplication,还没有创建 ApplicationContext
    • 示例
      java
      复制
      @Component
      public class ApplicationStartingListener implements ApplicationListener<ApplicationStartingEvent> {
          @Override
          public void onApplicationEvent(ApplicationStartingEvent event) {
              System.out.println("Application is starting");
          }
      }
      
  3. ApplicationEnvironmentPreparedEvent

    • 作用:在环境准备好时发布,但在创建 ApplicationContext 之前。可以用于调整环境属性。
    • 示例
      java
      复制
      @Component
      public class EnvironmentPreparedListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
          @Override
          public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
              System.out.println("Environment is prepared");
          }
      }
      
  4. ApplicationContextInitializedEvent

    • 作用:在 ApplicationContext 初始化时发布,但在加载任何 bean 定义之前。
    • 示例
      java
      复制
      @Component
      public class ContextInitializedListener implements ApplicationListener<ApplicationContextInitializedEvent> {
          @Override
          public void onApplicationEvent(ApplicationContextInitializedEvent event) {
              System.out.println("ApplicationContext initialized");
          }
      }
      
  5. ApplicationPreparedEvent

    • 作用:在 ApplicationContext 已被创建并加载,但未刷新时发布。此时可以进行最后的修改。
    • 示例
      java
      复制
      @Component
      public class ApplicationPreparedListener implements ApplicationListener<ApplicationPreparedEvent> {
          @Override
          public void onApplicationEvent(ApplicationPreparedEvent event) {
              System.out.println("Application context is prepared");
          }
      }
      
  6. CommandLineRunner 和 ApplicationRunner

    • 作用:在 ApplicationContext 被刷新并启动后调用。用于在应用启动后执行一些逻辑。
    • 示例
      java
      复制
      @Component
      public class MyCommandLineRunner implements CommandLineRunner {
          @Override
          public void run(String... args) throws Exception {
              System.out.println("CommandLineRunner executed");
          }
      }
      
  7. ApplicationStartedEvent

    • 作用:在 ApplicationContext 刷新并启动后立即发送。应用程序已启动,但尚未接收请求。
    • 示例
      java
      复制
      @Component
      public class ApplicationStartedListener implements ApplicationListener<ApplicationStartedEvent> {
          @Override
          public void onApplicationEvent(ApplicationStartedEvent event) {
              System.out.println("Application started");
          }
      }
      
  8. ApplicationReadyEvent

    • 作用:在应用程序完全启动并准备好接收请求时发布。
    • 示例
      java
      复制
      @Component
      public class ApplicationReadyListener implements ApplicationListener<ApplicationReadyEvent> {
          @Override
          public void onApplicationEvent(ApplicationReadyEvent event) {
              System.out.println("Application is ready to receive requests");
          }
      }
      
  9. ApplicationFailedEvent

    • 作用:在启动过程中遇到异常时发布。用于记录错误或执行失败恢复逻辑。
    • 示例
      java
      复制
      @Component
      public class ApplicationFailedListener implements ApplicationListener<ApplicationFailedEvent> {
          @Override
          public void onApplicationEvent(ApplicationFailedEvent event) {
              System.out.println("Application failed: " + event.getException().getMessage());
          }
      }
      

详细解释

  • SpringApplication.run() 是启动的入口,触发整个生命周期。
  • 事件监听器 可以让你在应用程序的不同阶段插入逻辑,比如在环境准备好时调整配置,在应用完全启动后执行初始化任务等。
  • CommandLineRunner 和 ApplicationRunner 提供了在应用启动结束后立即执行代码的钩子。
  • ApplicationFailedEvent 是处理启动失败的重要机制,帮助开发者记录和处理异常。

通过这些方法和事件,Spring Boot 提供了一个灵活的机制来管理应用程序的启动过程,允许开发者在不同的生命周期阶段执行自定义逻辑。

posted on 2025-03-06 14:47  卡米i  阅读(6)  评论(0)    收藏  举报