摘要:本文介绍了如何在Spring Boot启动后执行特定的初始化逻辑。
环境
Windows 10 企业版 LTSC 21H2
Java 1.8
Maven 3.6.3
Spring 5.3.31
Spring Boot 2.7.18
1 两种接口
1.1 CommandLineRunner
CommandLineRunner接口用于在应用启动后执行特定的初始化逻辑,支持获取参数。
实现CommandLineRunner接口:
java1 2 3 4 5 6 7 8
| @Component public class DemoCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("应用启动完成,执行初始化逻辑"); System.out.println("原始参数: " + Arrays.toString(args)); } }
|
启动时传入参数:
cmd1
| java -jar demo-springboot-1.0.0-SNAPSHOT.jar --demo.name=demo-springboot --demo.user=alice --demo.user=sam 1 2 3
|
打印结果:
log1 2
| 应用启动完成,执行初始化逻辑 原始参数: [--demo.name=demo-springboot, --demo.user=alice, --demo.user=sam, 1, 2, 3]
|
1.2 ApplicationRunner
ApplicationRunner接口同CommandLineRunner接口功能相同,但是对参数进行了封装。
实现ApplicationRunner接口:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @Component public class DemoApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("应用启动完成,执行初始化逻辑"); List<String> nonOptionArgs = args.getNonOptionArgs(); System.out.println("非选项参数: " + nonOptionArgs); Set<String> optionNames = args.getOptionNames(); System.out.println("选项参数名称: " + optionNames); for (String optionName : optionNames) { List<String> optionValues = args.getOptionValues(optionName); System.out.println("选项参数值: " + optionName + " = " + optionValues); } boolean hasDebug = args.containsOption("debug"); System.out.println("是否包含debug参数: " + hasDebug); } }
|
启动时传入参数:
cmd1
| java -jar demo-springboot-1.0.0-SNAPSHOT.jar --demo.name=demo-springboot --demo.user=alice --demo.user=sam 1 2 3
|
打印结果:
log1 2 3 4 5 6
| 应用启动完成,执行初始化逻辑 非选项参数: [1, 2, 3] 选项参数名称: [demo.user, demo.name] 选项参数值: demo.user = [alice, sam] 选项参数值: demo.name = [demo-springboot] 是否包含debug参数: false
|
2 控制顺序
两个接口可以同时使用,当有多个实现时,可以使用@Order注解控制执行顺序。
数值越小,优先级越高,越早执行,没有设置顺序会最后执行。
第一个执行:
java1 2 3 4 5 6 7 8
| @Component @Order(1) public class FirstRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("第一个执行"); } }
|
第二个执行:
java1 2 3 4 5 6 7 8
| @Component @Order(2) public class SecondRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("第二个执行"); } }
|
3 使用场景
通用业务场景:
系统检查:检查系统环境
配置加载:从外部源加载配置信息
缓存预热:预热缓存数据,提高系统响应速度
数据初始化:加载初始数据到数据库
定时任务初始化:初始化定时任务调度器,加载定时任务规则
发送通知:启动完成后发送通知信息
注册服务:向服务注册中心注册服务实例
条