springboot的ApplicationRunner和CommandLineRunner

简介: springboot的ApplicationRunner和CommandLineRunner

当我们希望在springboot容器后,执行一些操作的时候,我们可以考虑使用ApplicationRunner或者CommandLineRunner

问题:

  1. ApplicationRunner与CommandLineRunner谁先执行
  2. 两者的区别在哪
  3. 多个CommandLineRunner 执行顺序问题


1.ApplicationRunner与CommandLineRunner谁先执行。


我们在一个应用中分别实现两个接口

@Component
    public class CommandLineRunnerTest implements CommandLineRunner {
  @Override
  public void run(String... arg0) throws Exception {
    System.out.println("CommandLineRunner=====执行开始");
        for (int i = 0; i < arg0.length; i++) {
          System.out.println(arg0[i]);
        }
    System.out.println("CommandLineRunner=====执行完毕");
      }
    }
复制代码
@Component
    public class ApplicationRunnerTest implements ApplicationRunner {
      @Override
      public void run(ApplicationArguments arg0) throws Exception {
        System.out.println("ApplicationRunner=====执行开始");
        System.out.println(arg0.getNonOptionArgs());
        System.out.println(arg0.getOptionNames());
        System.out.println("ApplicationRunner=====执行完成");
      }
    }
复制代码


从执行结果来看,ApplicationRunner默认先于CommandLineRunner执行


ApplicationRunner=====执行开始
    []
    [name, age]
    [lisi]
    ApplicationRunner=====执行完成
    CommandLineRunner=====执行开始
    --name=lisi
    --age=12
    CommandLineRunner=====执行完毕
复制代码


2.两者的区别,以及与main方法的联系


两个接口中都有run方法,负责接收来自应用外部的参数,ApplicationRunner的run方法会将外部参数封装成一个ApplicationArguments对象,而CommandLineRunner接口中run方法的参数则为String数组。

我们再回头看看main方法

@SpringBootApplication
    public class AliyunmqApplication {
      public static void main(String[] args) {
        System.out.println("main方法==========执行开始");
        for (int i = 0; i < args.length; i++) {     
          System.out.println(args[i]);      
        }
        System.out.println("main方法==========执行完毕");
        SpringApplication.run(AliyunmqApplication.class, args);
      }
    }
复制代码

我们看到main方法也是接收一个args 数组参数。

执行发现:

main方法==========执行开始
    --name=lisi
    --age=12
    main方法==========执行完毕
    ..............
    ..............
    ApplicationRunner=====执行开始
    []
    [name, age]
    [lisi]
    ApplicationRunner=====执行完成
    CommandLineRunner=====执行开始
    --name=lisi
    --age=12
    CommandLineRunner=====执行完毕
复制代码

main方法的arg参数 和 CommandLineRunner方法的arg数组的值是一样的。

总的来看: ApplicationRunner run方法中的ApplicationArguments 对象,对输入参数做了封装,让我们可以使用 get**()的形式获取参数。CommandLineRunner run方法的arg数组则是原装。

以eclipse为例看参数设置:



image.png

image.png


3. 多个实现类的执行顺序


两种方法

  • 使用@Order(value=整数值)
  • 实现Ordered接口,在方法里return 一个顺序值
相关文章
|
7月前
|
存储 Java 测试技术
《Spring 测试指南》:JPA、MockMvc 和 @SpringBootTest 详解
Spring 提供了一组测试工具,可以轻松地测试 Spring 应用程序的各个组件,包括控制器、服务、存储库和其他组件。它具有丰富的测试注释、实用程序类和其他功能,以帮助进行单元测试、集成测试等。
124 0
|
Java Spring
Spring Boot CommandLineRunner接口详解
Spring Boot CommandLineRunner接口详解
Spring Boot CommandLineRunner接口详解
|
7月前
|
Java
Springboot 之 HandlerMethodArgumentResolver 运用
Springboot 之 HandlerMethodArgumentResolver 运用
84 0
|
7月前
|
Java
SpringBoot:第六篇 CommandLineRunner
SpringBoot:第六篇 CommandLineRunner
46 0
|
缓存 Java Spring
Spring - @PostConstruct 源码解析
@PostConstruct 源码解析
306 1
Spring - @PostConstruct 源码解析
|
Java Spring 容器
Spring Boot - ApplicationRunner && CommandLineRunner扩展接口
ApplicationRunner && CommandLineRunner扩展接口
257 0
Spring Boot - ApplicationRunner && CommandLineRunner扩展接口
SpringBoot2.x基础篇:使用CommandLineRunner或ApplicationRunner
如果你想要使用`SpringBoot`构建的项目在启动后运行一些特定的代码,那么`CommandLineRunner`、`ApplicationRunner`都是很好的选择。
|
前端开发 Java 应用服务中间件
深入学习Springboot的注解@SpringBootApplication
深入学习Springboot的注解@SpringBootApplication
173 0
深入学习Springboot的注解@SpringBootApplication
|
XML 缓存 Java
Spring - @PostConstruct & @PreDestroy
Spring - @PostConstruct & @PreDestroy
198 0
Spring - @PostConstruct & @PreDestroy
|
开发框架 Java API
@PostConstruct注解是Spring提供的?今天讲点不一样的
@PostConstruct注解是Spring提供的?今天讲点不一样的
427 0
@PostConstruct注解是Spring提供的?今天讲点不一样的