4.9. 启动系统任务

有一些特殊的任务需要在系统启动前执行,例如配置文件加载、数据库初始化等操作。如果没有使用Spring Boot,这些问题可以在Listener 中解决。Spring Boot 对此提供了两种解决方案:CommandLineRunner 和ApplicationRunner 。CommandLineRunner 和ApplicationRunner 基本一致,差别主要体现在参数上

 

4.9.1. CommandLineRunner

Spring Boot 项目在启动时会遍历所有CommandLineRunner 的实现类并调用其中的run 方法,如果整个系统中有多个CommandLineRunner 的实现类,那么可以使用@Order 注解对这些实现类的调用顺序进行排序

 

 

复制代码
@Component
@Order(1)
public class MyCommandLineRunner1 implements CommandLineRunner {
  @Override
  public void run(String... args) throws Exception {
    System.out.println("Runnerl>>>" + 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));
  }
}
复制代码

 

@Order(1)注解用来描述CommandLineRunner 的执行顺序,数字越小越先执行。

参数是系统启动时传入的参数,即入口类中main 方法的参数(在调用SpringApplication.run 方法时被传入Spring Boot 项目中)。

 

 

4.9.2. ApplicationRunner

复制代码
@Component
@Order(2)
public class MyApplicationRunner1 implements ApplicationRunner {
  @Override
  public void run(ApplicationArguments args) throws Exception {
    List<String> nonOptionArgs = args.getNonOptionArgs();
    System.out.println("1-nonOptionArgs>>>" + nonOptionArgs);
    Set<String> optionNames = args.getOptionNames();
    for(String optionName : optionNames) {
      System.out.println("1-key:" + optionName + ";value:" + args.getOptionValues(optionName));
  } }

@Component @Order(1) public class MyApplicationRunner2 implements ApplicationRunner {   @Override   public void run(ApplicationArguments args) throws Exception {     List<String> nonOptionArgs = args.getNonOptionArgs();     System.out.println("2-nonOptionArgs>>>" + nonOptionArgs);     Set<String> optionNames = args.getOptionNames();     for(String optionName : optionNames ) {       System.out.println("2-key:" + optionName + ";value:" + args.getOptionValues(optionName));
  }
}
复制代码

这里run 方法的参数是一个ApplicationArguments 对象, 如果想从ApplicationArguments 对象中获取入口类中main 方法接收的参数,调用ApplicationArguments 中的getNonOptionArgs 方法即可。

ApplicationArguments中的getOptionNames 方法用来获取项目启动命令行中参数的key 例如将本项目打成jar 包,运行java -jar xxx.jar -name=Michael 命令来启动项目, 此时getOptionNames 方法获取到的是name , 而getOptionValues 方法则是获取相应的value .

 

接下来运行mvnpackage 命令对项目进行打包

mvn package

进入打包目录中, 执行如下命令启动项目:

Java - jar linerunner-0.0.1.jar --name=Michael --age=99 三国演义 罗贯中

--name=Michael --age=99 都属于getOptionNames/getOptionValues 范畴。

后面的“三国演义”“罗贯中”可以通过getNonOptionArgs 方法获取,获取到的是一个数组,相当于上文提到的运行时配直的ProgramArguments 。

结果

 

posted @   小白冲冲  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示