目录
  • 1 方法
    • 方法1:spring的ApplicationListener< ContextRefreshedEvent>接口
    • 方法2:springboot的ApplicationRunner接口
    • 方法3:springboot的CommandLineRunner接口
  • 2 指定执行顺序
    • 3 原理

      springboot项目启动后执行方法,有三种实现方式。

      1 方法

      • ApplicationListener< ContextRefreshedEvent> 不推荐
      • ApplicationListener  推荐
      • CommandLineRunner 推荐

      方法1:spring的ApplicationListener< ContextRefreshedEvent>接口

      实现ApplicationListener接口,并实现 onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)方法

      @Service
      public class SearchReceive implements  ApplicationListener<ContextRefreshedEvent> {
         @Override
         public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
             if (contextRefreshedEvent.getApplicationContext().getParent() == null) {//保证只执行一次
                 //需要执行的方法
             }
         }
      }
      

      方法2:springboot的ApplicationRunner接口

      ApplicationListener和CommandLineRunner两个接口是springBoot提供用来在spring容器加载完成后执行指定方法。两个接口区别主要是入参不同。

      实现ApplicationRunner接口

      @Component
      @Order(value = 1)
      public class AfterRunner implements ApplicationRunner {
          @Override
          public void run(ApplicationArguments args) throws Exception {
              System.out.println("执行方法");
          }
      }
      

      方法3:springboot的CommandLineRunner接口

      实现CommandLineRunner接口

      @Component
      @Order(value = 2)
      public class CommandLineRunnerImpl implements CommandLineRunner {
          @Override
          public void run(String... args) throws Exception {
              System.out.println("执行方法");
          }
      }
      

      注:如果同时implements   ApplicationListener和CommandLineRunner两个接口,ApplicationRunner接口的方法先执行,CommandLineRunner后执行;

      @Slf4j
      @Component
      public class RunnerTest implements ApplicationRunner, CommandLineRunner {
       
        @Override
        public void run(ApplicationArguments args) throws Exception {
          System.out.println("服务启动RunnerTest   ApplicationRunner执行启动加载任务...");
        }
       
        @Override
        public void run(String... args) throws Exception {
          System.out.println("服务启动RunnerTest    CommandLineRunner 执行启动加载任务...");
          }
        }
      }
      

      2 指定执行顺序

      当项目中同时实现了ApplicationRunner和CommondLineRunner接口时,可使用Order注解或实现Ordered接口来指定执行顺序,值越小越先执行。

      3 原理

      SpringApplication 的run方法会执行afterRefresh方法。

      afterRefresh方法会执行callRunners方法。

      callRunners方法会调用所有实现ApplicationRunner和CommondLineRunner接口的方法。

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。