热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot之Runner启动器

一般项目在部署启动后,需要执行一些诸如清除缓存等初始化的工作,虽然可以通过人工手动调用接口等方式完成,但是会容易遗漏,且不够优雅。这里推荐使用SpringBoot的Runner启动

一般项目在部署启动后,需要执行一些诸如清除缓存等初始化的工作,虽然可以通过人工手动调用接口等方式完成,但是会容易遗漏,且不够优雅。这里推荐使用SpringBoot的Runner启动器,其会在服务启动后自动地执行相关初始化任务

CommandLineRunner、ApplicationRunner接口

SpringBoot提供了两个Runner启动器——CommandLineRunner、ApplicationRunner接口。二者实际上并无太大区别,只是前者是通过数组接收启动参数而后者则是将启动参数封装到ApplicationArguments对象中。实际开发过程中只需在接口的run方法中实现我们的初始化操作即可。当然不要忘了在启动器类上添加@Component注解

  1. @FunctionalInterface

  2. public interface CommandLineRunner {

  3. /**

  4. * Callback used to run the bean.

  5. * @param args incoming main method arguments

  6. * @throws Exception on error

  7. */

  8. void run(String... args) throws Exception;

  9. }

  10. ...

  11. @FunctionalInterface

  12. public interface ApplicationRunner {

  13. /**

  14. * Callback used to run the bean.

  15. * @param args incoming application arguments

  16. * @throws Exception on error

  17. */

  18. void run(ApplicationArguments args) throws Exception;

  19. }

实践

我们以项目启动后打印相关信息为例介绍其用法,这里我们有3个Runner启动器类。当有多个Runner启动器时,可通过@Order注解指定执行的优先级顺序,数值越小,优先级越高,越先被执行

  1. @Component

  2. @Order(1)

  3. public class SystemPrompt1 implements CommandLineRunner {

  4. @Override

  5. public void run(String... args) throws Exception {

  6. System.out.println("SystemPrompt1: 系统初始化完成");


  7. // 获取参数 方式1

  8. System.out.println("------- 获取参数 方式1 -------");

  9. for(String str : args) {

  10. System.out.println("str: " + str);

  11. }

  12. }

  13. }

  14. ...

  15. @Component

  16. @Order(value = 2)

  17. public class SystemPrompt2 implements CommandLineRunner {

  18. @Override

  19. public void run(String... args) throws Exception {

  20. System.out.println("SystemPrompt2: 系统初始化完成");

  21. }

  22. }

  23. ...

  24. @Component

  25. @Order(value = 3)

  26. public class SystemPrompt3 implements ApplicationRunner {

  27. @Override

  28. public void run(ApplicationArguments args) throws Exception {

  29. System.out.println("SystemPrompt3: 系统初始化完成");


  30. // 获取参数 方式1

  31. System.out.println("------- 获取参数 方式1 -------");

  32. for(String str : args.getSourceArgs()) {

  33. System.out.println("str: " + str);

  34. }


  35. // 获取参数 方式2

  36. System.out.println("------- 获取参数 方式2 -------");

  37. for(String str : args.getOptionNames()) {

  38. System.out.println("key: " + str + " value: " + args.getOptionValues(str));

  39. }

  40. }

  41. }

然后,我们在 IntelliJ IDEA 中添加项目的启动参数

启动后测试结果如下所示,Runner启动器相互之间的顺序符合我们的预期

在ApplicationRunner中,main参数即可通过getSourceArgs()来获取原始的字符串数组,也可以通过getOptionNames()、getOptionValues(String name)方法分别获取参数的名称集合、指定名称参数的值(值的类型为List



推荐阅读
author-avatar
jp85201
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有