原文链接:SpringBoot – 03 – 启动加载类ApplicationRunner的使用


相关文章:


在使用 SpringBoot 的过程中,我们有时候会需要在项目启动后做一些初始化的工作,这时候 ApplicationRunner 就派上用场了


一、单个实现示例

  • 我们需要定义一个类来实现 ApplicationRunner 接口,并覆盖其 run() 方法,同时将其注册为 bean 对象

    • application.yml

      server:
        port: 9999
      
    • MyApplicationRunner.java

      @Component
      public class MyApplicationRunner implements ApplicationRunner {
      
          @Override
          public void run(ApplicationArguments args) throws Exception {
              System.out.println("I am MyApplicationRunner");
          }
      }
      
      // I am MyApplicationRunner
      

二、多个实现示例

  • 当初始化工作比较多的时候,我们可能会创建多个类来实现 ApplicationRunner 接口,这时候我们可以通过 @Order 注解来决定执行的先后顺序,值越小越先执行

    • MyApplicationRunner1.java

      @Component
      @Order(value = 1)
      public class MyApplicationRunner1 implements ApplicationRunner {
      
          @Override
          public void run(ApplicationArguments args) throws Exception {
              System.out.println("I am MyApplicationRunner1");
          }
      }
      
    • MyApplicationRunner2.java

      @Component
      @Order(value = 2)
      public class MyApplicationRunner2 implements ApplicationRunner {
      
          @Override
          public void run(ApplicationArguments args) throws Exception {
              System.out.println("I am MyApplicationRunner2");
          }
      }
      
      // I am MyApplicationRunner1
      // I am MyApplicationRunner2
      

三、参数解析

  • 在使用过程中,我们会发现 run() 方法中带有一个 ApplicationArguments 参数,它的主要目的在于保存启动时加入的额外参数

  • 举例说明

    • 设置参数
      在这里插入图片描述

      • 如上所示,设置了启动项目时的额外参数 --server.port=8888 spring
    • MyApplicationRunner.java

      @Component
      public class MyApplicationRunner implements ApplicationRunner {
      
          @Override
          public void run(ApplicationArguments args) throws Exception {
              System.out.println(args.containsOption("server.port"));
              System.out.println(args.getOptionValues("server.port"));
              System.out.println(JSON.toJSONString(args));
          }
      }
      
      // true
      // [8888]
      // {"nonOptionArgs":["spring"],"optionNames":["server.port"],"sourceArgs":["--server.port=8888","spring"]}
      
      • 由上可知,我们可以很清楚地看到 ApplicationArguments 中各个方法的作用了,通过 --server.port=8888 参数,我们将原来项目的 9999 端口改为了 8888

      • ApplicationArguments 类一个有五个方法,如下所示

        方法作用
        getSourceArgs()获取参数源
        getOptionNames()获取所有参数名称
        containsOption(String name)判断是否包含指定名称的参数
        getOptionValues(String name)根据参数名称来获取指定参数
        getNonOptionArgs()获取所有不是参数的配置项
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐