TypechoJoeTheme

香草物语

统计
登录
用户名
密码
/
注册
用户名
邮箱
输入密码
确认密码

Spring Boot 启动任务

Laughing博主
2020-09-28
/
0 评论
/
1,165 阅读
/
595 个字
/
百度已收录
09/28
本文最后更新于2024年03月18日,已超过185天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

启动任务场景

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

实现启动任务

使用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://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

    基本介绍

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

    使用

    定义ApplicationRunner实现类

    定义两个实现类MyApplicationRunner103MyApplicationRunner104,分别设置执行顺序为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输出完毕");
     }
    }
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

香草物语

本文链接:

https://www.xiangcaowuyu.net/java/spring-boot-startup-task.html(转载时请注明本文出处及文章链接)

评论 (0)
  1. 我心若水 闲逛
    Windows 7 · Google Chrome

    现在可以用了吧

    2018-10-02 回复
  2. 中国人 闲逛
    MacOS · Google Chrome

    非常好用的

    2018-06-10 回复