热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot之Runner启动器

一般项目在部署启动后,需要执行一些诸如清除缓存等初始化的工作,虽然可以通过人工手动调用接口等方式完成,但是会容易遗漏,且不够优雅。这里推荐使用SpringBoot的Runner启动

一般项目在部署启动后,需要执行一些诸如清除缓存等初始化的工作,虽然可以通过人工手动调用接口等方式完成,但是会容易遗漏,且不够优雅。这里推荐使用SpringBoot的Runner启动器,其会在服务启动后自动地执行相关初始化任务

CommandLineRunner、ApplicationRunner接口

SpringBoot提供了两个Runner启动器——CommandLineRunner、ApplicationRunner接口。二者实际上并无太大区别,只是前者是通过数组接收启动参数而后者则是将启动参数封装到ApplicationArguments对象中。实际开发过程中只需在接口的run方法中实现我们的初始化操作即可。当然不要忘了在启动器类上添加@Component注解

  1. @FunctionalInterface

  2. public interface CommandLineRunner {

  3. /**

  4. * Callback used to run the bean.

  5. * @param args incoming main method arguments

  6. * @throws Exception on error

  7. */

  8. void run(String... args) throws Exception;

  9. }

  10. ...

  11. @FunctionalInterface

  12. public interface ApplicationRunner {

  13. /**

  14. * Callback used to run the bean.

  15. * @param args incoming application arguments

  16. * @throws Exception on error

  17. */

  18. void run(ApplicationArguments args) throws Exception;

  19. }

实践

我们以项目启动后打印相关信息为例介绍其用法,这里我们有3个Runner启动器类。当有多个Runner启动器时,可通过@Order注解指定执行的优先级顺序,数值越小,优先级越高,越先被执行

  1. @Component

  2. @Order(1)

  3. public class SystemPrompt1 implements CommandLineRunner {

  4. @Override

  5. public void run(String... args) throws Exception {

  6. System.out.println("SystemPrompt1: 系统初始化完成");


  7. // 获取参数 方式1

  8. System.out.println("------- 获取参数 方式1 -------");

  9. for(String str : args) {

  10. System.out.println("str: " + str);

  11. }

  12. }

  13. }

  14. ...

  15. @Component

  16. @Order(value = 2)

  17. public class SystemPrompt2 implements CommandLineRunner {

  18. @Override

  19. public void run(String... args) throws Exception {

  20. System.out.println("SystemPrompt2: 系统初始化完成");

  21. }

  22. }

  23. ...

  24. @Component

  25. @Order(value = 3)

  26. public class SystemPrompt3 implements ApplicationRunner {

  27. @Override

  28. public void run(ApplicationArguments args) throws Exception {

  29. System.out.println("SystemPrompt3: 系统初始化完成");


  30. // 获取参数 方式1

  31. System.out.println("------- 获取参数 方式1 -------");

  32. for(String str : args.getSourceArgs()) {

  33. System.out.println("str: " + str);

  34. }


  35. // 获取参数 方式2

  36. System.out.println("------- 获取参数 方式2 -------");

  37. for(String str : args.getOptionNames()) {

  38. System.out.println("key: " + str + " value: " + args.getOptionValues(str));

  39. }

  40. }

  41. }

然后,我们在 IntelliJ IDEA 中添加项目的启动参数

启动后测试结果如下所示,Runner启动器相互之间的顺序符合我们的预期

在ApplicationRunner中,main参数即可通过getSourceArgs()来获取原始的字符串数组,也可以通过getOptionNames()、getOptionValues(String name)方法分别获取参数的名称集合、指定名称参数的值(值的类型为List



推荐阅读
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
author-avatar
jp85201
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有