Spring Boot 启动任务

Laughing
2020-09-28 / 0 评论 / 1,246 阅读 / 搜一下 / 正在检测是否收录...

启动任务场景

如果在项目启动阶段要做一些数据初始化操作,例如配置文件加载、数据库初始化等操作。这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行。这种,我们可以通过启动任务来完成。

实现启动任务

使用CommandLineRunner实现

基本介绍

Spring Boot 项目在启动时会遍历所有的 CommandLineRunner的实现类并调用其中的 run方法。

  1. 如果整个系统中有多个 CommandLineRunner 的实现类,那么可以使用 @Order 注解对这些实现类的调用顺序进行排序(数字越小越先执行)。
  2. run 方法的参数是系统启动是传入的参数,即入口类中 main 方法的参数(在调用 SpringApplication.run 方法时被传入 Spring Boot 项目中)

CommandLineRunner使用

定义CommandLineRunner实现类

定义两个实现类MyCommandLineRunner101MyCommandLineRunner102,分别设置执行顺序为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

基本介绍

  1. ApplicationRunner 用法和CommandLineRunner 基本一致。项目在启动时会遍历所有的 ApplicationRunner 的实现类并调用其中的 run 方法。
  2. 如果整个系统中有多个ApplicationRunner 的实现类,同样可以使用 @Order 注解对这些实现类的调用顺序进行排序(数字越小越先执行)。
  3. ApplicationRunnerCommandLineRunner 的区别主要体现在 run 方法的参数上。不同于 CommandLineRunner 中的 run 方法的数组参数,ApplicationRunnerrun 方法的参数是一个 ApplicationArguments 对象
    ApplicationArguments 区分选项参数和非选项参数
  4. 对于非选项参数:我们可以通过 ApplicationArgumentsgetNonOptionArgs() 方法获取,获取到的是一个数组。
  5. 对于选项参数:可以通过 ApplicationArgumentsgetOptionNames() 方法获取所有选项名称。通过 getOptionValues() 方法获取实际值(它会返回一个列表字符串)。

使用

定义ApplicationRunner实现类

定义两个实现类MyApplicationRunner103MyApplicationRunner104,分别设置执行顺序为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输出完毕");
    }
}
0

评论 (0)

取消
  1. 头像
    我心若水
    Windows 7 · Google Chrome

    现在可以用了吧

    回复
  2. 头像
    中国人
    MacOS · Google Chrome

    非常好用的

    回复