Java 中 Spring Boot 怎么使用 CommandLineRunner 和 ApplicationRunner 接口实现项目启动后的数据预热

轻雪同学_7215

轻雪同学_7215

2026-07-24

662人浏览

原创

spring boot 中 commandlinerunner 和 applicationrunner 用于应用上下文加载完成后、web 容器启动前执行初始化逻辑;前者接收原始命令行参数,适合轻量任务;后者通过 applicationarguments 提供结构化参数解析,适合动态行为控制;均支持 @order 排序且需注意异常处理与耗时操作异步化。

java 中 spring boot 怎么使用 commandlinerunner 和 applicationrunner 接口实现项目启动后的数据预热

Spring Boot 提供了 CommandLineRunnerApplicationRunner 两个接口,用于在应用上下文加载完成后、服务正式对外提供请求前执行初始化逻辑,比如缓存预热、数据库校验、远程配置拉取等。两者功能相似,但参数设计不同,选择取决于你是否需要解析命令行参数。

CommandLineRunner:适合简单参数处理

它只有一个 run(String... args) 方法,接收原始的命令行参数数组(即启动时加在 java -jar xxx.jar 后面的参数),适合做轻量级启动任务。

  • 实现类需标注 @Component,Spring 会自动注册为 Bean
  • 多个 Runner 可通过 @Order 或实现 Ordered 接口控制执行顺序(数值越小越先执行)
  • 若发生异常,应用默认会启动失败(除非捕获并处理)

示例:

@Component
@Order(1)
public class CachePreloader implements CommandLineRunner {
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void run(String... args) throws Exception {
        // 从数据库查热点商品,写入 Redis
        List<product> hotProducts = productMapper.getHotProducts();
        hotProducts.forEach(p -> redisTemplate.opsForValue().set("product:" + p.getId(), p));
        System.out.println("✅ 热点商品缓存预热完成");
    }
}</product>

ApplicationRunner:支持结构化参数解析

它的 run(ApplicationArguments args) 方法传入的是封装好的 ApplicationArguments 对象,能更方便地区分非选项参数(getNonOptionArgs())和带前缀的选项参数(如 --env=prod,用 getOptionNames()getOptionValues() 获取)。

Social Media Commander
Social Media Commander

全栈社交媒体管理技能,涵盖内容创作、审核、排程、发布、漏斗管理、数据分析、受众洞察、竞争对手分析。

下载
  • 适合需要根据启动参数动态决定预热行为的场景(例如仅在 prod 环境预热)
  • 参数解析更健壮,避免手动拆分字符串带来的错误
  • 同样支持 @Order 控制顺序

示例:

@Component
@Order(2)
public class ConfigSyncRunner implements ApplicationRunner {
    @Value("${spring.profiles.active:dev}")
    private String profile;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        if ("prod".equals(profile) && args.containsOption("preload")) {
            syncRemoteConfig();
            System.out.println("✅ 远程配置同步完成");
        }
    }

    private void syncRemoteConfig() {
        // 调用配置中心 API 拉取最新配置并加载到本地
    }
}

执行时机与注意事项

这两个接口的 run() 方法会在 ApplicationContext 初始化完毕后、Web 容器(如 Tomcat)完全启动前执行。此时所有 Bean 已就绪,可安全注入和调用,但 HTTP 服务尚未监听端口,无法接收外部请求。

  • 不要在 run() 中执行耗时过长的操作(如全量数据导入),否则会拖慢启动速度,甚至触发健康检查超时
  • 建议将重逻辑异步化(如用 TaskExecutor@Async),同时记录日志或设置启动标志便于监控
  • 若预热失败需降级,应明确处理异常,避免阻断整个应用启动(视业务容忍度决定是否吞掉异常)

替代方案:ApplicationRunner vs @PostConstruct vs ApplicationReadyEvent

@PostConstruct 在 Bean 初始化后立即执行,不保证其他 Bean 已创建完毕,不适合依赖复杂上下文的预热;ApplicationReadyEvent 是事件机制,在 Web 服务已启动、端口已监听后发布,适用于需要“服务就绪后”才触发的逻辑(如注册到 Nacos、发送启动通知),但不适合缓存预热这类需在服务可用前完成的任务。

  • 优先选 CommandLineRunnerApplicationRunner 做启动预热
  • 若需精确控制阶段,比如“端口监听后但流量接入前”,可结合 LivenessStateCallback 或自定义 Health Indicator

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

8717

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

5942

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5332

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

964

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

808

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1136

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2309

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19651

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1055

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Spring Boot 官方快速入门指南
Spring Boot 官方快速入门指南

共0课时 | 0人学习

Spring Boot 官方参考文档
Spring Boot 官方参考文档

共0课时 | 0人学习

尚硅谷新版SpringBoot3教程
尚硅谷新版SpringBoot3教程

共0课时 | 0人学习