SpringBoot 项目启动后执行一次性任务

SpringBoot 项目启动后执行一次性任务

需求:容器启动成功后,执行一次,只跑一遍

1. 【最简单推荐】CommandLineRunner

适合简单启动任务,写一个类实现接口,重写run方法。Spring 容器完全初始化完成后执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class AppStartupRunner implements CommandLineRunner {

@Override
public void run(String... args) throws Exception {
// 这里写你启动后一次性执行的业务代码
System.out.println("====项目启动完成,执行一次性任务====");
// initData();
// loadCache();
}
}
  • 特点:
    • @Component交给 Spring 管理,自动运行
    • 多个 CommandLineRunner 可以用 @Order(1) 指定执行顺序,数字越小越先执行
1
2
3
4
5
6
7
@Component
@Order(1)
public class RunnerA implements CommandLineRunner{...}

@Component
@Order(2)
public class RunnerB implements CommandLineRunner{...}

2. ApplicationRunner

和 CommandLineRunner 几乎一样,区别是参数被封装解析过,方便解析启动命令行参数。

1
2
3
4
5
6
7
8
9
10
11
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class AppStartupTask implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("ApplicationRunner 执行");
}
}

✅ 两者执行时机:Bean 全部创建完成 → 容器就绪 → 执行 Runner 此时 DataSource、MyBatis、所有 Bean 都已经就绪,可以直接调用 Mapper/Service。

3. 监听事件:ApplicationReadyEvent(事件监听方案)

适合解耦,监听应用就绪事件,容器完全启动成功才触发。

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class AppReadyListener {

@EventListener(ApplicationReadyEvent.class)
public void onReady() {
System.out.println("监听到:应用完全启动就绪!");
// 一次性初始化逻辑
}
}

SpringBoot 项目启动后执行一次性任务
https://taylorandtony.github.io/2026/10/18/SpringBoot-项目启动后执行一次性任务/
作者
TaylorAndTony
发布于
2026年10月18日
许可协议