启动任务场景
如果在项目启动阶段要做一些数据初始化操作,例如配置文件加载、数据库初始化等操作。这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行。这种,我们可以通过启动任务来完成。
实现启动任务
使用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://www.xiangcaowuyu.net */@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://www.xiangcaowuyu.net */@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://www.xiangcaowuyu.net */@Component@Order(103)public class MyApplicationRunner103 implements ApplicationRunner { @Override public void run(ApplicationArguments args) { System.out.println("开始输出103的ApplicationRunner"); System.out.println("开始输出103可选参数"); Set optionNames = args.getOptionNames(); for (String optionName : optionNames) { System.out.println(args.getOptionValues(optionName)); } System.out.println("可选参数103输出完毕"); System.out.println("开始输出103非可选参数"); List 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://www.xiangcaowuyu.net */@Component@Order(104)public class MyApplicationRunner104 implements ApplicationRunner { @Override public void run(ApplicationArguments args) { System.out.println("开始输出104的ApplicationRunner"); System.out.println("开始输出104可选参数"); Set optionNames = args.getOptionNames(); for (String optionName : optionNames) { System.out.println(args.getOptionValues(optionName)); } System.out.println("可选参数104输出完毕"); System.out.println("开始输出104非可选参数"); List nonOptionArgs = args.getNonOptionArgs(); for (String nonOptionArg : nonOptionArgs) { System.out.println(nonOptionArg); } System.out.println("非可选参数104输出完毕"); }}
idea测试
配置Program arguments,如下
查看输出
代码已上传到码云
下载代码
git clone https://gitee.com/lisen0629/lisen_org.git
使用
进入克隆的位置,执行命令进入对应工程
cd runner