一、什么是 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 執行");}
}