抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文介绍了如何在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接口:

java
1
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));
}
}

启动时传入参数:

cmd
1
java -jar demo-springboot-1.0.0-SNAPSHOT.jar --demo.name=demo-springboot --demo.user=alice --demo.user=sam 1 2 3

打印结果:

log
1
2
应用启动完成,执行初始化逻辑
原始参数: [--demo.name=demo-springboot, --demo.user=alice, --demo.user=sam, 1, 2, 3]

1.2 ApplicationRunner

ApplicationRunner接口同CommandLineRunner接口功能相同,但是对参数进行了封装。

实现ApplicationRunner接口:

java
1
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);
}
}

启动时传入参数:

cmd
1
java -jar demo-springboot-1.0.0-SNAPSHOT.jar --demo.name=demo-springboot --demo.user=alice --demo.user=sam 1 2 3

打印结果:

log
1
2
3
4
5
6
应用启动完成,执行初始化逻辑
非选项参数: [1, 2, 3]
选项参数名称: [demo.user, demo.name]
选项参数值: demo.user = [alice, sam]
选项参数值: demo.name = [demo-springboot]
是否包含debug参数: false

2 控制顺序

两个接口可以同时使用,当有多个实现时,可以使用@Order注解控制执行顺序。

数值越小,优先级越高,越早执行,没有设置顺序会最后执行。

第一个执行:

java
1
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("第一个执行");
}
}

第二个执行:

java
1
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 使用场景

通用业务场景:

  • 系统检查:检查系统环境
  • 配置加载:从外部源加载配置信息
  • 缓存预热:预热缓存数据,提高系统响应速度
  • 数据初始化:加载初始数据到数据库
  • 定时任务初始化:初始化定时任务调度器,加载定时任务规则
  • 发送通知:启动完成后发送通知信息
  • 注册服务:向服务注册中心注册服务实例

评论