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()

      • 获取不是参数的配置项

三、参考资料

posted @ 2019-06-05 17:08  GeneXu  阅读(275)  评论(0)    收藏  举报