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 一个顺序值
相关文章
|
弹性计算 Ubuntu Linux
幻兽帕鲁服务器清档教程
介绍了Linux(ubuntu)和Windows平台下清除服务器存档的教程。适用于计算巢部署和已有ECS部署。
6339 0
|
12月前
|
存储 安全 Java
|
5月前
|
人工智能 前端开发 JavaScript
【CodeBuddy】三分钟开发一个实用小功能之:数字华容道拼图
本文通过实现数字华容道游戏,展示codebuddy智能编程助手的强大功能。只需简单描述需求,codebuddy即可生成高质量代码,涵盖HTML、CSS和JavaScript,大幅提升开发效率。其核心功能包括智能代码生成、优化与调试,以及持续学习进化能力。未来,codebuddy有望进一步增强代码可读性、支持更多语言框架,并提升智能化水平,助力开发者专注于设计与创新,开启智能编码新时代。
175 10
【CodeBuddy】三分钟开发一个实用小功能之:数字华容道拼图
SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理
SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理
|
8月前
|
监控 jenkins Shell
jenkins结合gitlab实现CI(持续集成)
通过本文的介绍,我们详细了解了如何结合Jenkins和GitLab实现持续集成。从环境准备、插件配置到Pipeline任务创建和CI流程监控,每一步都提供了详细的操作步骤和示例代码。希望本文能帮助开发者快速搭建起高效的CI系统,提高项目开发效率和代码质量。
634 8
|
运维 安全 测试技术
自动化运维的利剑:Ansible在企业级部署中的应用与挑战
本文深入探讨了Ansible,这一领先的IT自动化工具,如何在企业级部署中扮演关键角色。我们将通过实际案例分析,揭示Ansible在简化配置管理、加速应用部署和提高运维效率方面的优势。同时,文章也将不回避Ansible实施过程中可能遇到的技术挑战与限制,并提供针对性的解决策略。阅读本文后,您将获得一个全面的视角,理解Ansible在现代企业运维中不可或缺的地位,以及如何克服其面临的主要问题。
246 1
|
算法 JavaScript 决策智能
基于禁忌搜索算法的TSP路径规划matlab仿真
**摘要:** 使用禁忌搜索算法解决旅行商问题(TSP),在MATLAB2022a中实现路径规划,显示优化曲线与路线图。TSP寻找最短城市访问路径,算法通过避免局部最优,利用禁忌列表不断调整顺序。关键步骤包括初始路径选择、邻域搜索、解评估、选择及禁忌列表更新。过程示意图展示搜索效果。
|
监控 前端开发 Java
深入理解 org.springframework.web.servlet.AsyncHandlerInterceptor
深入理解 org.springframework.web.servlet.AsyncHandlerInterceptor
234 0
|
SQL 数据库 数据安全/隐私保护
mybatis-plus实现多租户
mybatis-plus实现多租户
216 0
|
数据库 开发者
Gremlin 语法入门| 学习笔记
快速学习 Gremlin 语法入门。
Gremlin 语法入门| 学习笔记