原创

如何在项目启动过程中实现自定义操作

温馨提示:
本文最后更新于 2024年03月03日,已超过 325 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

上一篇我们使用本地阻塞队列时,实现了ServletContextListener接口在项目启动后创建了一个单线程的线程池来处理我们的日志阻塞队列的内容,今天我们就针对此实现方式来简单聊一下,看看都有哪些方案可以实现项目启动后自定义操作这个功能:

  • 使用Spring框架中@EventListener注解,监听Spring Boot的启动事件(如ContextRefreshedEvent表示应用上下文初始化完成或被刷新所发布的事件),当Spring发布相应的事件时,标记有@EventListener的方法会被自动调用

    @Slf4j
    @Component
    public class ArticleListener6 {
      @EventListener
      public void handleContextRefreshedEvent(ContextRefreshedEvent event) {
          log.info("利用@EventListener注解实现自定义操作");
      }
    }
    
  • 实现ApplicationListener接口并指定监听的事件类型,这也是Spring框架中提供的,实现了该接口的类在应用启动发布相应事件时,如果监听了相应事件的方法会被触发执行

    @Slf4j
    @Component
    public class ArticleListener7 implements ApplicationListener<ApplicationStartedEvent> {
      @Override
      public void onApplicationEvent(ApplicationStartedEvent event) {
          log.info("实现ApplicationListener接口实现自定义操作");
      }
    }
    
  • 实现SmartLifecycle接口,这是Spring Boot中的一个接口,我们可以在这里执行一些自定义操作。但是这个接口的主要作用是给开发者提供自定义Bean生命周期的能力

    @Slf4j
    @Component
    public class ArticleListener5 implements SmartLifecycle {
      private boolean isRunning = false;
      @Override
      public void start() {
          if (!isRunning) {
              log.info("实现SmartLifecycle接口应用启动后的自定义逻辑操作");
              isRunning = true;
          }
      }
      @Override
      public void stop() {
          if (isRunning) {
              log.info("实现SmartLifecycle接口实现应用停止前的自定义逻辑操作");
              isRunning = false;
          }
      }
      @Override
      public boolean isRunning() {
          return isRunning;
      }
    }
    
  • 通过实现CommandLineRunner接口并注入到Spring IoC容器中,这是Spring Boot特有的接口,可以实现应用启动后执行特定的逻辑。这个接口提供了一个run方法,我们可以在这里执行一些自定义操作

    @Slf4j
    @Component
    public class ArticleListener3 implements CommandLineRunner {
      @Override
      public void run(String... args) {
          log.info("实现CommandLineRunner接口实现自定义操作");
      }
    }
    
  • CommandLineRunner类似,ApplicationRunner也是Spring Boot提供的一个接口,用于在应用启动后执行特定逻辑。它的使用方式与CommandLineRunner基本相同

    @Slf4j
    @Component
    public class ArticleListener4 implements ApplicationRunner {
      @Override
      public void run(ApplicationArguments args) {
          log.info("实现ApplicationRunner接口实现自定义操作");
      }
    }
    
  • 实现ServletContextListener接口,当Web应用程序启动时,会触发contextInitialized方法,我们可以在这里执行一些自定义操作

    @Slf4j
    @Component
    public class ArticleListener implements ServletContextListener {
      @Override
      public void contextInitialized(ServletContextEvent sce) {
          log.info("实现ServletContextListener接口实现自定义操作");
      }
    }
    
  • 定义一个监听类并在类中写一个方法,在这个方法上使用@PostConstruct注解,标记的方法会在所有依赖注入完成后被自动调用,这里也可以执行一些自定义操作

    @Slf4j
    @Component
    public class ArticleListener2 {
      @PostConstruct
      public void onApplicationEvent() {
          log.info("利用@PostConstruct注解实现自定义操作");
      }
    }
    

日志

总的来说,这些方法各有特点,我们可以根据实际需求和场景选择合适的方式来实现应用启动后的自定义逻辑

正文到此结束
本文目录