一、什么是 CommandLineRunner
CommandLineRunner
是 Spring Boot 提供的一个 函数式接口,声明如下:
该接口只有一个 run(String... args)
方法,会在 Spring Boot 容器启动完成后被自动调用。
你可以将它理解为一种“钩子函数”,用于执行初始化逻辑。
二、CommandLineRunner 的作用
主要用于:
作用 | 说明 |
---|---|
启动初始化操作 | 加载缓存数据、初始化数据库数据、生成初始配置文件等 |
校验环境依赖 | 比如检查数据库、Redis、外部服务是否可用 |
注册服务或发送启动日志 | 向注册中心、监控系统报告服务已启动 |
接收命令行参数 | 解析命令行参数,实现不同的启动模式(例如 debug 、batch ) |
三、如何实现 CommandLineRunner?
1. 基本用法
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class MyStartupRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("应用启动完成,开始执行初始化逻辑...");// 可以执行任意逻辑,例如初始化数据、加载缓存等}
}
只要这个类被 Spring 扫描到(加了 @Component
),Spring Boot 启动后就会自动执行 run()
方法。
2. 注入其他 Bean 使用
@Component
public class DataInitializer implements CommandLineRunner {private final UserRepository userRepository;public DataInitializer(UserRepository userRepository) {this.userRepository = userRepository;}@Overridepublic void run(String... args) throws Exception {if (userRepository.count() == 0) {userRepository.save(new User("admin", "123456"));System.out.println("已插入初始用户");}}
}
此时你可以访问数据库、Redis 等所有依赖,因为上下文已完全加载。
3. 使用 @Order
控制执行顺序(多个 CommandLineRunner)
@Component
@Order(1)
public class Runner1 implements CommandLineRunner {public void run(String... args) {System.out.println("Runner1 执行");}
}@Component
@Order(2)
public class Runner2 implements CommandLineRunner {public void run(String... args) {System.out.println("Runner2 执行");}
}