Spring Boot中 CommandLineRunner 与 ApplicationRunner作用、区别

CommandLineRunner 和 ApplicationRunner 是 Spring Boot 提供的两种用于在应用程序启动后执行初始化代码的机制。这两种接口允许你在 Spring 应用上下文完全启动后执行一些自定义的代码,通常用于执行一次性初始化任务,如数据库预填充、缓存预热等。

CommandLineRunner

CommandLineRunner 是一个简单的接口,它只有一个方法:

java 复制代码
public interface CommandLineRunner {
    void run(String... args) throws Exception;
}

此接口的 run 方法接受一个字符串数组参数,代表命令行参数。这意味着你可以访问应用启动时传递给它的参数。如果实现 CommandLineRunner 接口的类被 Spring 扫描到,那么它的 run 方法将在应用启动完成且所有单例 Bean 被创建之后执行。

ApplicationRunner

ApplicationRunner 类似于 CommandLineRunner,但它提供了更丰富的功能,特别是它允许你访问 ApplicationArguments 对象:

java 复制代码
public interface ApplicationRunner {
    void run(ApplicationArguments args) throws Exception;
}

ApplicationArguments 提供了对命令行参数的更高级访问,它能够区分选项和非选项参数,并能判断参数是否包含非选项参数。这对于需要处理复杂命令行参数的应用非常有用。

区别

主要的区别在于 ApplicationRunner 提供了对命令行参数的更精细控制,而 CommandLineRunner 则直接提供一个字符串数组。

执行顺序

如果存在多个 CommandLineRunner 或 ApplicationRunner 的实现,它们将按照 Bean 的定义顺序执行。如果需要自定义执行顺序,可以实现 Ordered 接口或使用 @Order 注解。

示例

这里是一个使用 CommandLineRunner 的示例:

java 复制代码
@Component
public class MyCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner is running...");
    }
}

这里是一个使用 ApplicationRunner 的示例:

java 复制代码
@Component
public class MyApplicationRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner is running...");
        if (args.containsOption("debug")) {
            System.out.println("Debug mode is enabled.");
        }
    }
}

示例执行结果

两者都是在 Spring Boot 应用启动完成后执行的,可以用来执行必要的初始化任务。

相关推荐
bcbnb4 分钟前
Flutter-Notebook代码混淆:Android与iOS平台安全配置
后端·ios
凯尔萨厮8 分钟前
Java学习笔记十五(GUI)
java·笔记·学习
泡海椒15 分钟前
SpringBoot 集成 JQuick-Curl:Spring 环境完整接入教程,第三方接口调用别再到处手写模板类
后端
落木萧萧82515 分钟前
MyBatis 关联查询的四种写法,为什么最后都变回了手写 XML
java·数据库·后端
csdn2015_15 分钟前
java springboot项目,接收到的参数多个逗号
java·开发语言·spring boot
cui_hao_nan17 分钟前
Spring AOP 自调用、代理与 private 方法引发的诡异 NPE
java·后端·spring·ai开发
码艺-Alimjan26 分钟前
维吾尔语数字转文本
java·javascript·python·算法·go
摇滚侠28 分钟前
《SpringBoot 3:入门与应用实战》第 13 章 整合 MyBatis MyBatis 简单开发 阅读笔记 39
spring boot·笔记·mybatis
事圆则缓33 分钟前
Java 常见数据结构与 Android 使用场景
android·java·数据结构
IT_陈寒40 分钟前
JavaScript的隐式转换太坑了,我的==比较怎么就炸了?
前端·人工智能·后端