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("====项目启动完成,执行一次性任务===="); } }
|
- 特点:
@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("监听到:应用完全启动就绪!"); } }
|