启动任务场景
如果在项目启动阶段要做一些数据初始化操作,例如配置文件加载、数据库初始化等操作。这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行。这种,我们可以通过启动任务来完成。
实现启动任务
使用CommandLineRunner实现
基本介绍
Spring Boot 项目在启动时会遍历所有的 CommandLineRunner
的实现类并调用其中的 run
方法。
- 如果整个系统中有多个
CommandLineRunner
的实现类,那么可以使用@Order
注解对这些实现类的调用顺序进行排序(数字越小越先执行)。 - run 方法的参数是系统启动是传入的参数,即入口类中
main
方法的参数(在调用SpringApplication.run
方法时被传入 Spring Boot 项目中)
CommandLineRunner使用
定义CommandLineRunner实现类
定义两个实现类MyCommandLineRunner101
、MyCommandLineRunner102
,分别设置执行顺序为101和102。
MyCommandLineRunner101.java
/**
* 顺序号是101的启动任务
* @author laughing
* @date 2020/9/26
* @site https://lisen.cc
*/
@Component
@Order(101)
public class MyCommandLineRunner101 implements CommandLineRunner {
@Override
public void run(String... args) {
System.out.println("order--101--" + Arrays.toString(args));
}
}
MyCommandLineRunner102.java
/**
* 顺序号是102的启动任务
* @author laughing
* @date 2020/9/26
* @site https://lisen.cc
*/
@Component
@Order(102)
public class MyCommandLineRunner102 implements CommandLineRunner {
@Override
public void run(String... args) {
System.out.println("order--102--" + Arrays.toString(args));
}
}
idea测试
配置Program arguments
,如下
jar 包测试
java -jar runner-0.0.1-SNAPSHOT.jar Hello World
查看输出
通过输出结果,我们可以看到,内容正确按照设置的order
顺序进行输出。
ApplicationRunner
基本介绍
ApplicationRunner
用法和CommandLineRunner
基本一致。项目在启动时会遍历所有的ApplicationRunner
的实现类并调用其中的run
方法。- 如果整个系统中有多个
ApplicationRunner
的实现类,同样可以使用@Order
注解对这些实现类的调用顺序进行排序(数字越小越先执行)。 ApplicationRunner
与CommandLineRunner
的区别主要体现在 run 方法的参数上。不同于CommandLineRunner
中的run
方法的数组参数,ApplicationRunner
里run
方法的参数是一个ApplicationArguments
对象
ApplicationArguments 区分选项参数和非选项参数- 对于非选项参数:我们可以通过
ApplicationArguments
的getNonOptionArgs()
方法获取,获取到的是一个数组。 - 对于选项参数:可以通过
ApplicationArguments
的getOptionNames()
方法获取所有选项名称。通过getOptionValues()
方法获取实际值(它会返回一个列表字符串)。
使用
定义ApplicationRunner实现类
定义两个实现类MyApplicationRunner103
、MyApplicationRunner104
,分别设置执行顺序为103和104。
MyApplicationRunner103.java
/**
* 顺序号103
*
* @author laughing
* @date 2020/9/26
* @site https://lisen.cc
*/
@Component
@Order(103)
public class MyApplicationRunner103 implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("开始输出103的ApplicationRunner");
System.out.println("开始输出103可选参数");
Set<String> optionNames = args.getOptionNames();
for (String optionName : optionNames) {
System.out.println(args.getOptionValues(optionName));
}
System.out.println("可选参数103输出完毕");
System.out.println("开始输出103非可选参数");
List<String> nonOptionArgs = args.getNonOptionArgs();
for (String nonOptionArg : nonOptionArgs) {
System.out.println(nonOptionArg);
}
System.out.println("非可选参数103输出完毕");
}
}
MyApplicationRunner104.java
/**
* 顺序号104
*
* @author laughing
* @date 2020/9/26
* @site https://lisen.cc
*/
@Component
@Order(104)
public class MyApplicationRunner104 implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("开始输出104的ApplicationRunner");
System.out.println("开始输出104可选参数");
Set<String> optionNames = args.getOptionNames();
for (String optionName : optionNames) {
System.out.println(args.getOptionValues(optionName));
}
System.out.println("可选参数104输出完毕");
System.out.println("开始输出104非可选参数");
List<String> nonOptionArgs = args.getNonOptionArgs();
for (String nonOptionArg : nonOptionArgs) {
System.out.println(nonOptionArg);
}
System.out.println("非可选参数104输出完毕");
}
}
现在可以用了吧
非常好用的