有时一些特殊的任务需要在系统启动时执行,例如配置文件加载、数据库初始化等操作。Spring Boot 提供了两种解决方案:CommandLineRunner 和 ApplicationRunner。二者使用方式大体一致,差别主要体现在参数上。
一、使用 CommandLineRunner
Spring Boot 项目在启动时会遍历所有的 CommandLineRunner 的实现类并调用其中的 run 方法。
(1)首先在项目中添加两个 CommandLineRunner 新建两个类,它们内容分别如下,就是把启动时传入的参数打印出来:
- @Component
- @Order(1)
- public class MyCommandLineRunner1 implements CommandLineRunner {
- @Override
- public void run(String... args) throws Exception {
- System.out.println("Runner1>>>"+ Arrays.toString(args));
- }
- }
-
- @Component
- @Order(2)
- public class MyCommandLineRunner2 implements CommandLineRunner {
- @Override
- public void run(String... args) throws Exception {
- System.out.println("Runner2>>>"+ Arrays.toString(args));
- }
- }
(2)我们可以配置在系统启动时需要传入的参数,这里以 intelliJ IDEA 为例,单击右上角的编辑启动配置。
(3)在弹出页中编辑 Program arguments 栏目,在里面填写需要传入的参数。如果有多个参数,参数之间使用空格隔开。这里我们既配了选项参数,也配了非选项参数。
如果我们将项目打包,以 jar 包的形式运行。那么这些参数可以跟在启动命令后面:
java -jar springboot-demo-0.0.1-SNAPSHOT.jar --name=zhangsan --age=25 zhangsan1 251
(4)启动项目,控制台输出如下:
二、使用 ApplicationRunner
(1)ApplicationRunner 用法和 CommandLineRunner 基本一致。项目在启动时会遍历所有的 ApplicationRunner 的实现类并调用其中的 run 方法。
如果整个系统中有多个 ApplicationRunner 的实现类,同样可以使用 @Order 注解对这些实现类的调用顺序进行排序(数字越小越先执行)。
(2)ApplicationRunner 与 CommandLineRunner 的区别主要体现在 run 方法的参数上。不同于 CommandLineRunner 中的 run 方法的数组参数,ApplicationRunner 里 run 方法的参数是一个 ApplicationArguments 对象。
ApplicationArguments 区分选项参数和非选项参数:
(1)首先在项目中添加两个 ApplicationRunner,它们内容分别如下,就是把启动时传入的参数打印出来:
- @Component
- @Order(1)
- public class MyApplicationRunner1 implements ApplicationRunner {
- @Override
- public void run(ApplicationArguments args) throws Exception {
- List
nonOptionArgs = args.getNonOptionArgs(); - System.out.println("Runner1[非选项参数]>>> " + nonOptionArgs);
- Set
optionNames = args.getOptionNames(); - for(String optionName: optionNames) {
- System.out.println("Runner1[选项参数]>>> name:" + optionName
- + ";value:" + args.getOptionValues(optionName));
- }
- }
- }
-
- @Component
- @Order(2)
- public class MyApplicationRunner2 implements ApplicationRunner {
- @Override
- public void run(ApplicationArguments args) throws Exception {
- List
nonOptionArgs = args.getNonOptionArgs(); - System.out.println("Runner2[非选项参数]>>> " + nonOptionArgs);
- Set
optionNames = args.getOptionNames(); - for(String optionName: optionNames) {
- System.out.println("Runner2[选项参数]>>> name:" + optionName
- + ";value:" + args.getOptionValues(optionName));
- }
- }
- }
(2)启动项目,控制台输出如下: