Spring Boot 3启动加载器详解(含源码解析)

一、引言

Spring Boot 3启动加载器是提升开发效率和应用程序启动速度的关键组件。本文将详细介绍Spring Boot 3的启动加载器,包括其实现方式、应用场景及工作原理等。

说明:本文分析使用的Spring Boot源码版本为3.3.5

二、启动加载器简介

启动加载器在Spring Boot中扮演着重要的角色,它允许开发者在应用程序启动时执行一些初始化任务。Spring Boot提供了两种主要的启动加载器接口:CommandLineRunner和ApplicationRunner。通过实现这两个接口,开发者可以定义在应用程序启动时需要执行的代码。

三、启动加载器实现方式及区别

实现方式

1、CommandLineRunner接口
CommandLineRunner接口允许开发者在Spring Boot应用程序启动时执行代码,并接收命令行参数。实现该接口需要覆盖run方法,并注册为Spring容器中的Bean。

   @Component@Order(1)public class FirstCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("run FirstCommandLineRunner");}}

下面是该接口的源码中的说明:
CommandLineRunner源码

核心内容是:

  • 用于指示当一个 Bean 被包含在 SpringApplication 中时应该运行的接口。
  • 同一个应用上下文中可以定义多个 CommandLineRunner Bean ,并且可以通过实现 Ordered 接口或使用 @Order 注解来对它们进行排序。
  • 如果需要访问 ApplicationArguments 而不是原始的字符串数组,可以考虑使用 ApplicationRunner。

2、ApplicationRunner接口
ApplicationRunner接口与CommandLineRunner类似,也是一个函数式接口,但它接收的参数是ApplicationArguments,而不是简单的字符串数组。ApplicationArguments提供了更丰富的参数处理功能,如获取源参数、选项名称等。

   @Component@Order(2)public class FirstApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println("run FirstApplicationRunner");}}

下面是该接口的源码中的说明:
ApplicationRunner源码

核心内容是:

  • 用于指示当一个 Bean 被包含在 SpringApplication 中时应该运行的接口。
  • 同一个应用上下文中可以定义多个 ApplicationRunner Bean,并且可以通过实现Ordered接口或使用@Order 注解来对它们进行排序。

3、 使用@Order注解
@Order注解可以用来指定多个启动加载器的执行顺序。数值越小,优先级越高。

@Component@Order(1)public class FirstCommandLineRunner implements CommandLineRunner {// ...}@Component@Order(2)public class FirstApplicationRunner implements ApplicationRunner {// ...}

两种实现方式的区别

CommandLineRunner和ApplicationRunner是两种启动加载器接口,它们的主要区别在于参数类型和灵活性。

CommandLineRunner

  • 参数类型:CommandLineRunner接口的run方法接收一个String[]类型的参数,这个参数包含了启动应用时传递的命令行参数。
  • 灵活性:由于CommandLineRunner直接接收字符串数组作为参数,因此它提供了对命令行参数的基本访问。然而,这种访问方式相对简单,没有提供对参数进行进一步解析或分类的功能。
  • 使用场景:当应用需要快速访问命令行参数,并且不需要对参数进行复杂解析时,CommandLineRunner是一个合适的选择。

ApplicationRunner

  • 参数类型:ApplicationRunner接口的run方法接收一个ApplicationArguments类型的参数。ApplicationArguments是一个更复杂的对象,它提供了对命令行参数的详细访问,包括原始参数、选项参数、非选项参数等。
  • 灵活性:ApplicationRunner通过ApplicationArguments对象提供了对命令行参数的丰富访问方式。这使得开发者可以更方便地解析和处理命令行参数,包括区分选项参数和非选项参数,以及获取参数的默认值等。
  • 使用场景:当应用需要处理复杂的命令行参数,或者需要对参数进行精细分类和解析时,ApplicationRunner是更合适的选择。

四、应用场景

启动加载器在Spring Boot应用程序中有广泛的应用场景,包括但不限于:

  • 初始化数据:在应用启动时加载或初始化必要的数据,如数据库表结构、缓存配置等。
  • 配置检查:验证应用程序的配置是否正确。
  • 第三方服务调用:在启动时调用第三方服务进行必要的初始化。
  • 日志记录:记录应用启动的时间、版本信息等日志信息。
  • 版本兼容性检查:检查依赖库或第三方服务的版本兼容性,确保应用能够正常运行。

五、工作原理

Spring Boot的启动加载器工作原理相对简单,但非常有效。在应用程序启动时,Spring Boot会查找所有实现了CommandLineRunner和ApplicationRunner接口的Bean,并按照优先级顺序(通过@Order注解或默认的排序规则)调用它们的run方法。

具体来说,Spring Boot应用启动时,org.springframework.boot.SpringApplication#run(java.lang.String…)方法会调用callRunners方法,该方法会获取所有实现了启动加载器接口的Bean,并进行排序。然后,它会遍历这些Bean,并调用它们的run方法。

启动加载器调用栈

源码如下:

public ConfigurableApplicationContext run(String... args) {// ...callRunners(context, applicationArguments);// ...
}private void callRunners(ConfigurableApplicationContext context, ApplicationArguments args) {ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();String[] beanNames = beanFactory.getBeanNamesForType(Runner.class);Map<Runner, String> instancesToBeanNames = new IdentityHashMap<>();for (String beanName : beanNames) {instancesToBeanNames.put(beanFactory.getBean(beanName, Runner.class), beanName);}Comparator<Object> comparator = getOrderComparator(beanFactory).withSourceProvider(new FactoryAwareOrderSourceProvider(beanFactory, instancesToBeanNames));instancesToBeanNames.keySet().stream().sorted(comparator).forEach((runner) -> callRunner(runner, args));}

callRunners 方法的主要功能是从给定的 ConfigurableApplicationContext 中获取所有实现了 Runner 接口的 Bean,并按照一定的顺序调用这些 Bean 的 run 方法。

  1. 获取 Bean 工厂:从 context 中获取 ConfigurableListableBeanFactory。
  2. 获取 Bean 名称:从 Bean 工厂中获取所有实现了 Runner 接口的 Bean 的名称。
  3. 创建映射:创建一个 Map,将每个 Runner 实例与其对应的 Bean 名称关联起来。
  4. 排序:使用 getOrderComparator 获取一个排序器,并设置一个源提供者,以便根据依赖关系对 Runner 实例进行排序。
  5. 调用 Runner:遍历排序后的 Runner 实例,并依次根据 Runner 实现的具体接口(ApplicationRunner 或 CommandLineRunner)调用相应的 run 方法。

六、总结

Spring Boot 3的启动加载器为开发者提供了一个灵活而强大的机制,用于在应用程序启动时执行必要的初始化任务。通过实现CommandLineRunner或ApplicationRunner接口,并结合@Order注解,开发者可以轻松地定义和管理启动加载器,从而提升应用程序的启动速度和开发效率。

在实际开发中,合理利用启动加载器可以大大简化初始化任务的编写和管理,使应用程序更加健壮和易于维护。这些启动加载器在初始化数据、安全检查、日志记录等场景中发挥着重要作用,有助于提升应用的稳定性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480549.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UDP客户端服务器通信

在这篇博客中&#xff0c;我们将探索 UDP&#xff08;用户数据报协议&#xff09; 通信&#xff0c;简要地说&#xff0c;UDP 是一种无连接、快速但不可靠的通信协议&#xff0c;适用于需要快速数据传输但对丢包容忍的场景&#xff0c;比如视频流和在线游戏。就像《我是如此相信…

手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案

手机实时提取SIM卡打电话的信令声音 --智能拨号器app的双SIM卡切换方案 一、前言 在蓝牙电话的方案中&#xff0c;由于采用市场上的存量手机来做为通讯呼叫的载体&#xff0c;而现在市面上大部分的手机都是“双卡双待单通”手机&#xff0c;简称双卡双待手机。即在手机开机后…

Spring Boot 同时接受文件和实体及 Postman 测试实战

Spring Boot 文件上传及 Postman 测试指南 在本文中&#xff0c;我们将介绍如何使用 Spring Boot 上传文件并通过 Postman 测试接口。我们会基于以下接口作为示例&#xff1a; Boolean importDevicePushConfig(RequestParam("file") MultipartFile file,DevicePush…

Paddle Inference部署推理(一)

一&#xff1a;Paddle Inference推理 简介 Paddle Inference 是飞桨的原生推理库&#xff0c;提供服务器端的高性能推理能力。由于 Paddle Inference 能力直接基于飞桨的训练算子&#xff0c;因此它支持飞桨训练出的所有模型的推理。 Paddle Inference 功能特性丰富&#xff…

搭建文件服务器并使用Qt实现文件上传和下载(带账号和密码)

文章目录 0 背景1 搭建文件服务器2 代码实现文件上传和下载2.1 在pro文件中添加网络支持2.2 创建网络管理类2.3 文件上传2.4 文件下载 3 扩展&#xff08;其他方法实现文件上传和下载&#xff09;3.1 python3.2 npm3.3 ftp服务器 4 完整的代码 0 背景 因为需要使程序具备在远程…

社交新零售模式下“2+1 链动模式 S2B2C 商城小程序”的创新实践与发展策略

摘要&#xff1a;随着实体商业与社交网络深度融合&#xff0c;社交新零售蓬勃兴起&#xff0c;“21 链动模式 S2B2C 商城小程序”作为其中创新典范&#xff0c;融合独特激励机制与数字化运营优势&#xff0c;重塑零售生态。本文剖析该模式架构、运作逻辑&#xff0c;探讨其在私…

【Git】Git 完全指南:从入门到精通

Git 完全指南&#xff1a;从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一&#xff0c;它帮助开发者高效地管理项目&#xff0c;支持分布式协作和版本控制。无论是个人项目还是团队开发&#xff0c;Git 都能提供强大的功能来跟踪、管理代码变更&#xff0c;并保障…

华为E9000刀箱(HWE9000V2)服务器硬件监控指标解读

随着数据中心规模的不断扩大&#xff0c;服务器的稳定性和可靠性变得尤为重要。华为E9000刀箱&#xff08;HWE9000V2&#xff09;作为一款高性能的服务器设备&#xff0c;其硬件状态的实时监控对于保障业务的连续性和系统的稳定运行至关重要。 监控易作为一款专业的IT基础设施监…

Css—实现3D导航栏

一、背景 最近在其他的网页中看到了一个很有趣的3d效果&#xff0c;这个效果就是使用css3中的3D转换实现的&#xff0c;所以今天的内容就是3D的导航栏效果。那么话不多说&#xff0c;直接开始主要内容的讲解。 二、效果展示 三、思路解析 1、首先我们需要将这个导航使用一个大…

gitee:删除仓库

1、点击主页面设置 2、找到左侧导航栏-数据管理->仓库空间信息&#xff1b;找到需要删除的仓库->点击设置 3、点击左侧仓库设置->点击右侧删除仓库 4、输入提示内容->确认删除 5、输入密码验证 6、成功删除提示

探索 Python 任务自动化的新境界:Invoke 库揭秘

文章目录 探索 Python 任务自动化的新境界&#xff1a;Invoke 库揭秘背景&#xff1a;为何选择 Invoke&#xff1f;什么是 Invoke&#xff1f;如何安装 Invoke&#xff1f;5个简单的库函数使用方法1. 定义任务2. 带参数的任务3. 运行 Shell 命令4. 任务参数化5. 列出任务 场景应…

深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接

1.前言 从一个高级语言到可执行程序&#xff0c;要经过预处理、编译&#xff0c;汇编和链接四个过程。大家可以思考下&#xff0c;为什么要有这样的过程&#xff1f; 我们学习计算机之处&#xff0c;就应该了解到&#xff0c;计算机能够识别的只有二进制语言&#xff08;这是…

六通道串口服务器

型号&#xff1a;SG-TCP232-620 1.1 功能 1.1.1 基本功能 串口服务器是串口 RS232/422/485 和以太网之间的一个转换器&#xff0c;实现串口数 据和以太网数据的双向透明传输&#xff0c;可以让串口设备立即联网&#xff0c;典型应用拓扑如下&#xff1a; 1.1.2 特色功能…

Ubuntu 18.04 中安装 RDKit(针对 Python 2.7)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

websocket前后端长连接之java部分

一共有4个类,第一个WebSocketConfig 配置类 Configuration EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer {Autowiredprivate WebSocketHandler webSocketHandler;Autowiredprivate WebSocketInterceptor webSocketInterceptor;Overridepubli…

PyCharm中Python项目打包并运行到服务器的简明指南

目录 一、准备工作 二、创建并设置Python项目 创建新项目 配置项目依赖 安装PyInstaller 三、打包项目 打包为可执行文件 另一种打包方式&#xff08;使用setup.py&#xff09; 四、配置服务器环境 五、上传可执行文件到服务器 六、在服务器上运行项目 配置SSH解释…

【UE5 C++课程系列笔记】05——组件和碰撞

效果 可以看到我们可以实现的功能是 &#xff08;1&#xff09;可以通过鼠标旋转视角 &#xff08;2&#xff09;通过使用Pawn移动组件来控制Pawn移动 &#xff08;3&#xff09;Pawn碰到物体会被阻挡然后逐渐滑动 &#xff08;4&#xff09;通过空格切换激活/关闭粒子效果…

格网法计算平面点云面积(matlab版本)

1、原理介绍 格网法计算平面点云面积&#xff0c;其思想类似高中油膜法计算面积。其将点云投影到水平面&#xff0c;再将点云划分成尺寸相同的格网。最后&#xff0c;统计格网内包含点的数量number&#xff0c;那么可利用如下公式计算得到点云的面积&#xff1a; Aeranumber*L…

ZooKeeper 基础知识总结

先赞后看&#xff0c;Java进阶一大半 ZooKeeper 官网这样介绍道&#xff1a;ZooKeeper 是一种集中式服务&#xff0c;用于维护配置信息、命名、提供分布式同步和提供组服务。 各位hao&#xff0c;我是南哥&#xff0c;相信对你通关面试、拿下Offer有所帮助。 ⭐⭐⭐一份南哥编写…

2024年第十三届”认证杯“数学中国数学建模国际赛(小美赛)

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓