springboot启动_spring boot 启动任务

启动任务场景

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

实现启动任务

使用CommandLineRunner实现

基本介绍

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

  1. 如果整个系统中有多个 CommandLineRunner 的实现类,那么可以使用 @Order 注解对这些实现类的调用顺序进行排序(数字越小越先执行)。
  2. 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,如下

c3fbf96f8e4abebe5f3b41be57b75634.png

jar 包测试

java -jar runner-0.0.1-SNAPSHOT.jar Hello World

查看输出

2e4581a3101d10517132ecd492f9678e.png


通过输出结果,我们可以看到,内容正确按照设置的order顺序进行输出。

ApplicationRunner

基本介绍

  1. ApplicationRunner 用法和CommandLineRunner 基本一致。项目在启动时会遍历所有的 ApplicationRunner 的实现类并调用其中的 run 方法。
  2. 如果整个系统中有多个ApplicationRunner 的实现类,同样可以使用 @Order 注解对这些实现类的调用顺序进行排序(数字越小越先执行)。
  3. 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,如下

ab59aba496152ffcf18b5c8ee1d2ba35.png

查看输出

7470672d10bb533e643889a38329f67f.png

代码已上传到码云

下载代码

git clone https://gitee.com/lisen0629/lisen_org.git

使用

进入克隆的位置,执行命令进入对应工程
cd runner

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值