CommandLineRunner或者ApplicationRunner接口

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CommandLineRunner或者ApplicationRunner接口相关的知识,希望对你有一定的参考价值。

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

官方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容器中进行处理

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

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

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

打印结果

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

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

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

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

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

启动类,

配置参数启动,

打印结果:

SpringBoot之启动初始化CommandLineRunner

实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些初始化的需求。 
为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现。

Spring Boot应用程序在启动后,会遍历CommandLineRunner接口的实例并运行它们的run方法。

利用@Order注解(或者实现Order接口)来规定所有CommandLineRunner实例的运行顺序。

@Order 注解的执行优先级是按value值从小到大顺序。

 

MyStartupRunner1.java

package com.zns.runner;

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(value=1)
public class MyStartupRunner1 implements CommandLineRunner {
    @Override
    public void run(String...args) throws Exception {
        System.out.println("服务启动执行,初始化操作 111");
    }
}

 

MyStartupRunner2.java

package com.zns.runner;

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(value=2)
public class MyStartupRunner2 implements CommandLineRunner {
    @Override
    public void run(String...args) throws Exception {
        System.out.println("服务启动执行,初始化操作 222");
    }
}

 


以上是关于CommandLineRunner或者ApplicationRunner接口的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 启动预加载数据 CommandLineRunner

springboot接口:CommandLineRunner

springboot启动项目时执行任务,从数据库或者redis获取系统参数

springboot 启动类CommandLineRunner(转载)

Spring boot CommandLineRunner介绍

springboot启动时执行任务CommandLineRunner