美文网首页
CommandLineRunner或者ApplicationRu

CommandLineRunner或者ApplicationRu

作者: 团长plus | 来源:发表于2018-06-05 09:50 被阅读12次

    前言

    CommandLineRunner、ApplicationRunner 接口是在容器启动成功后的最后一步回调(类似开机自启动)。

    CommandLineRunner接口

    [图片上传失败...(image-da3ff7-1528163352786)]

    官方doc:
    Interface used to indicate that a bean should run when it is contained within a SpringApplication. Multiple CommandLineRunner beans can be defined within the same application context and can be ordered using the Ordered interface or Order @Order annotation.
    接口被用作将其加入spring容器中时执行其run方法。多个CommandLineRunner可以被同时执行在同一个spring上下文中并且执行顺序是以order注解的参数顺序一致。

    If you need access to ApplicationArguments instead of the raw String array
    consider using ApplicationRunner.
    如果你需要访问ApplicationArguments去替换掉字符串数组,可以考虑使用ApplicationRunner类。

    先看一个demo:
    定义一个ServerStartedReport实现CommandLineRunner,并纳入到srping容器中进行处理

    package com.zhihao.miao;
    
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDateTime;
    
    @Order(2)
    @Component
    public class ServerStartedReport implements CommandLineRunner{
        @Override
        public void run(String... args) throws Exception {
            System.out.println("===========ServerStartedReport启动====="+ LocalDateTime.now());
        }
    }
    
    

    定义一个ServerSuccessReport实现CommandLineRunner,并纳入到spring容器处理

    package com.zhihao.miao;
    
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    import java.util.Arrays;
    
    @Order(1)
    @Component
    public class ServerSuccessReport implements CommandLineRunner{
        @Override
        public void run(String... args) throws Exception {
            System.out.println("=====应用已经成功启动====="+ Arrays.asList(args));
        }
    }
    
    

    启动类测试,也可以直接在spring容器访问该值,

    package com.zhihao.miao;
    
    import org.springframework.boot.ApplicationArguments;
    import org.springframework.boot.SpringApplication;
            import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            ConfigurableApplicationContext context =SpringApplication.run(Application.class,args);
            ApplicationArguments applicationArguments = context.getBean(ApplicationArguments.class);
            System.out.println("============");
            System.out.println("name="+applicationArguments.getOptionNames());
            System.out.println("values===="+applicationArguments.getOptionValues("developer.name"));
        }
    }
    
    

    配置参数,然后执行启动类

    [图片上传失败...(image-e77f0b-1528163352786)]

    打印结果

    [图片上传失败...(image-3d0097-1528163352786)]

    ApplicationRunner接口

    [图片上传失败...(image-ba9912-1528163352786)]

    发现二者的官方javadoc一样,区别在于接收的参数不一样。CommandLineRunner的参数是最原始的参数,没有做任何处理。ApplicationRunner的参数是ApplicationArguments,是对原始参数做了进一步的封装。

    ApplicationArguments是对参数(main方法)做了进一步的处理,可以解析--name=value的,我们就可以通过name来获取value(而CommandLineRunner只是获取--name=value)

    [图片上传失败...(image-35d2d5-1528163352786)]

    可以接收--foo=bar这样的参数。

    --getOptionNames()方法可以得到foo这样的key的集合。
    --getOptionValues(String name)方法可以得到bar这样的集合的value。

    看一个demo:
    定义MyApplicationRunner类继承ApplicationRunner接口,

    package com.zhihao.miao;
    
    import org.springframework.boot.ApplicationArguments;
    import org.springframework.boot.ApplicationRunner;
    import org.springframework.stereotype.Component;
    
    import java.util.Arrays;
    
    @Component
    public class MyApplicationRunner implements ApplicationRunner{
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            System.out.println("===MyApplicationRunner==="+ Arrays.asList(args.getSourceArgs()));
            System.out.println("===getOptionNames========"+args.getOptionNames());
            System.out.println("===getOptionValues======="+args.getOptionValues("foo"));
            System.out.println("==getOptionValues========"+args.getOptionValues("developer.name"));
        }
    }
    
    

    启动类,

    package com.zhihao.miao;
    
    import org.springframework.boot.SpringApplication;
            import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class,args);
        }
    }
    
    

    配置参数启动,

    image.png

    打印结果:

    image.png

    作者:二月_春风
    链接:https://www.jianshu.com/p/5d4ffe267596
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:CommandLineRunner或者ApplicationRu

          本文链接:https://www.haomeiwen.com/subject/qqqpsftx.html