CommandLineRunner、ApplicationRunner和@PostConstruct

在Spring Boot中,CommandLineRunnerApplicationRunner@PostConstruct 都是常用的生命周期管理接口或注解,它们有不同的用途和执行时机,帮助开发者在Spring应用启动过程中进行一些初始化操作或执行特定任务。下面分别介绍它们的特点、使用场景和区别。

1. CommandLineRunner

定义:
CommandLineRunner 是一个接口,包含一个 run(String... args) 方法。实现该接口的类会在Spring Boot应用启动完成后,立即执行 run() 方法。

用途:

  • 用于执行启动后的自定义任务。
  • 可以在应用启动后进行一些初始化工作,如加载数据、连接数据库、初始化缓存等。
  • run() 方法接收启动时传入的命令行参数。

示例代码:

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class MyCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner executed! Arguments: " + String.join(", ", args));
    }
}

执行时机:
CommandLineRunner 在Spring Boot应用启动时,ApplicationContext 被创建并初始化后执行。可以通过实现该接口来进行一些启动时的额外操作。


2. ApplicationRunner

定义:
ApplicationRunner 是另一个接口,类似于 CommandLineRunner,也包含一个 run(ApplicationArguments args) 方法。它的 run() 方法接收一个 ApplicationArguments 类型的参数,而非字符串数组。

用途:

  • ApplicationRunner 提供了一些更高级的功能,特别是对于命令行参数的处理。
  • ApplicationArguments 对象不仅包含传递给应用的命令行参数(如 args),还可以访问有名称的选项(例如,--option=value 的形式)。
  • CommandLineRunner 更加强大,适合需要解析命令行参数的场景。

示例代码:

import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.ApplicationArguments;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner executed!");
        // 打印命令行参数
        System.out.println("Non-option arguments: " + args.getNonOptionArgs());
        System.out.println("Option arguments: " + args.getOptionNames());
    }
}

执行时机:
ApplicationRunnerCommandLineRunner 的执行时机类似,都是在Spring应用上下文完全初始化后执行。


3. @PostConstruct

定义:
@PostConstruct 是一个注解,用于标注一个方法,该方法会在依赖注入完成后立即执行。它是JSR-250中的一部分,通常用于初始化bean或执行一些额外的操作。

用途:

  • 用于在Spring容器创建完bean之后,依赖注入完成后执行一些初始化任务。
  • 通常用于初始化数据、建立资源连接等,确保在Spring管理的bean完全初始化后执行。

示例代码:

import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;

@Component
public class MyPostConstructBean {

    @PostConstruct
    public void init() {
        System.out.println("PostConstruct method executed!");
    }
}

执行时机:
@PostConstruct 标注的方法会在Spring容器创建bean并完成依赖注入后,执行一次初始化任务。此时,bean已经被完全创建并且注入了所有依赖,但它尚未开始处理业务逻辑。


区别总结

特性CommandLineRunnerApplicationRunner@PostConstruct
接口/注解接口 (CommandLineRunner)接口 (ApplicationRunner)注解 (@PostConstruct)
方法签名void run(String... args)void run(ApplicationArguments args)用于标注的方法会没有参数,如 void init()
执行时机在Spring应用启动后,ApplicationContext 初始化完成后执行在Spring应用启动后,ApplicationContext 初始化完成后执行在bean的依赖注入完成后、bean完全初始化时执行
参数类型接受命令行参数(字符串数组)接受 ApplicationArguments 类型参数(提供更丰富的命令行参数信息)没有参数,直接执行初始化方法
典型用途适用于需要在应用启动时执行简单任务、处理命令行参数等适用于需要更复杂的命令行参数处理,或者解析选项和非选项参数用于bean的初始化操作,如设置字段值、连接资源等

总结

  • 如果只是简单地执行启动后的任务并且需要接收命令行参数,可以选择 CommandLineRunnerApplicationRunner,其中 ApplicationRunner 提供了更强大的命令行参数解析功能。
  • 如果需要在bean初始化之后执行一些任务,如依赖注入之后的操作,则可以使用 @PostConstruct

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【生物服务器】数据分析//论文润色/组学技术服务 、表观组分析、互作组分析、遗传转化实验、生物医学

DNA亲和纯化测序(DAP-seq)和组蛋白甲基化修饰是表观遗传学研究中两个重要的技术手段,它们在揭示基因表达调控机制和染色质结构动态变化中发挥着关键作用。然而,在实践过程中,这两种技术也存在一些痛点和挑战。 DNA亲和…

丹摩征文活动| 摩智云端深度解析:Faster R-CNN模型的训练与测试实战指南

目录 丹摩简介 文章前言Faster R-CNN的简介Faster RCNN的训练与测试提前准备1.1 mobaxterm(远程连接服务器)1.2 本文的源码下载 目标检测模型 Faster-Rcnn2.1云服务器平台 数据上传内置JupyterLab的使用本地连接使用DAMODEL实例获取实例的SSH访问信息通过…

二叉搜索树介绍

⼆叉搜索树 二叉搜索树的概念二叉搜索树的性能分析查找性能插入性能删除性能 二叉搜索树的插入二叉搜索树的查找二叉搜索树的删除⼆叉搜索树的实现代码测试代码 二叉搜索树key和key/value使⽤场景key搜索场景key/value搜索场景key/value⼆叉搜索树代码实现测试代码 二叉搜索树的…

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕:printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾: VS 2022 社区版C语言的安装教程,不要再卡在下载0B/s啦C语言入门:解锁基础概念,动手实现首个C程序C语言概念之旅:解锁关…

5.4.2-1 编写Java程序在HDFS上创建文件

本次实战涉及使用Java操作Hadoop HDFS,包括创建文件、判断文件存在性及异常处理。通过手动添加依赖、启动HDFS服务,成功在HDFS上创建和检查文件。进一步探索了文件操作的最佳实践,如检查文件存在性以避免重复创建,以及处理HDFS安全…

RabbitMQ教程:路由(Routing)(四)

文章目录 RabbitMQ教程:路由(Routing)(四)一、引言二、基本概念2.1 路由与绑定2.2 Direct交换机2.3 多绑定2.4 发送日志2.5 订阅 三、整合代码3.1 EmitLogDirectApp.cs3.2 ReceiveLogsDirectApp.cs3.3 推送所有和接收e…

智云-一个抓取web流量的轻量级蜜罐v1.5

智云-一个抓取web流量的轻量级蜜罐v1.5 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN 新增功能-自定义漏洞信息 可通过正则来添加相关路由以及响应来伪造 nacos的版本响应如下 日流量态势 月流量态势 抓取流量效果

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…

实验5:网络设备发现、管理和维护

实验5:网络设备发现、管理和维护 实验目的及要求: 通过实验,掌握Cisco 路由器和交换机的IOS配置管理。自动从NTP服务器获取时间信息。能够利用TFTP服务器实现路由器和交换机配置文件的备份和恢复。同时验证CDP协议和LLDP协议的网络参数。完…

vue 项目使用 nginx 部署

前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…

DataWorks on EMR StarRocks,打造标准湖仓新范式

在大数据领域,数据仓库和实时分析系统扮演着至关重要的角色。DataWorks 基于大数据引擎,为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台,为用户带来智能化的数据开发和分析体验。而阿里云提供的 EMR Serverless St…

七、利用CSS和多媒体美化页面的习题

题目一&#xff1a; 利用CSS技术&#xff0c;结合表格和列表&#xff0c;制作并美化 “ 翡翠阁 ”页面。运行效果如下 运行效果&#xff1a; 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>翡翠阁</title>&…

游戏引擎学习第15天

视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出&#xff08;IO&#xff09;操作的讨论。主要分为两类&#xff1a; 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源&#xff0c;例如音乐、音效、美术资源&#xff08;如 3D 模型和…

【动手学深度学习Pytorch】2. Softmax回归代码

零实现 导入所需要的包&#xff1a; import torch from IPython import display from d2l import torch as d2l定义数据集参数、模型参数&#xff1a; batch_size 256 # 每次随机读取256张图片 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) # 将展平每个…

51单片机基础05 实时时钟-思路及代码参考2、3

目录 一、思路二 1、原理图 2、代码 二、思路三 1、原理图 2、代码 一、思路二 所有设定功能相关的操作均在矩阵键盘进行实现&#xff0c;并在定时器中扫描、计数等 1、原理图 2、代码 #include <AT89X52.h> //调用51单片机的头文件 //------------------…

Notepad++的完美替代

由于Notepad的作者曾发表过可能在开发者代码中植入恶意软件的言论&#xff0c;他备受指责。在此&#xff0c;我向大家推荐一个Notepad的完美替代品——NotepadNext和Notepad--。 1、NotepadNext NotepadNext的特点&#xff1a; 1、跨平台兼容性 NotepadNext基于Electron或Qt…

Python | Leetcode Python题解之第564题数组嵌套

题目&#xff1a; 题解&#xff1a; class Solution:def arrayNesting(self, nums: List[int]) -> int:ans, n 0, len(nums)for i in range(n):cnt 0while nums[i] < n:num nums[i]nums[i] ni numcnt 1ans max(ans, cnt)return ans

面试经典 150 题:20、2、228、122

20. 有效的括号 参考代码 #include <stack>class Solution { public:bool isValid(string s) {if(s.size() < 2){ //特判&#xff1a;空字符串和一个字符的情况return false;}bool flag true;stack<char> st; //栈for(int i0; i<s.size(); i){if(s[i] ( |…

使用vscode+expo+Android夜神模拟器运行react-native项目

1.进入夜神模拟器安装路径下的bin目录 2.输入命令&#xff0c;连接Android Studio 启动夜神模拟器后&#xff0c; 打开安装目录的bin文件夹执行下面的命令&#xff0c;只需执行一次&#xff09; nox_adb.exe connect 127.0.0.1:62001adb connect 127.0.0.1:62001 3.运行项目…

【STM32】USB 简要驱动软件架构图

STM32 USB 软件架构比较复杂&#xff0c;建议去看 UM 1734 或者 st wiki STM32 USB call graph STM32 USB Device Library files organization Reference [1]: https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Introduction_to_USB_with_STM32 [2]: UM1734