一、官方推荐
所有应用启动期间需要执行的初始化任务,都必须用 CommandLineRunner 或 ApplicationRunner 来做,绝对不要写在构造器、@PostConstruct、静态代码块里。
二、代码案例
ApplicationRunner(推荐)
java
@Component
@Order(1) // 数字越小越先执行
public class MyStartupTask implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("✅ 应用启动完成,执行初始化任务...");
// 这里可以安全调用所有 Bean、Service、DAO、配置
// 加载缓存、初始化数据、校验配置、预热接口...
}
}
CommandLineRunner
java
@Component
@Order(2)
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("✅ 启动后执行命令行任务");
}
}
三、总结
1.Spring 启动任务,必须用CommandLineRunner/ApplicationRunner
2.它们的执行时间点:Spring 容器完全启动成功后、接收流量前 才执行 → 最安全、最稳定
3.用 @Order 控制执行顺序
4、可以写多个runner,执行不同的任务。
四、扩展
结合应用程序可用性状态,使用runner
java
@Component
@Order(1)
public class AppInitTask implements ApplicationRunner {
@Resource
private ApplicationAvailability applicationAvailability;
@Override
public void run(ApplicationArguments args) {
// 这里 100% 安全
ReadinessState state = applicationAvailability.getReadinessState();
if(state == ReadinessState.ACCEPTING_TRAFFIC){
System.out.println("🚀 应用已就绪,开始执行业务初始化");
// 加载缓存、初始化数据...
}
}
}