Laughing
Spring Boot 启动任务
启动任务场景
如果在项目启动阶段要做一些数据初始化操作,例如配置文件加载、数据库初始化等操作。这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行。这种,我们可以通过启动任务来完成。
实现启动任务
使用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<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://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<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输出完毕"); } }
香草物语
https://www.xiangcaowuyu.net/java/spring-boot-startup-task.html(转载时请注明本文出处及文章链接)
现在可以用了吧
非常好用的