1、基本说明

SpringBoot中的Runner接口是用来在Spring应用启动后执行一些初始化逻辑的接口。

它是一个函数式接口,只有一个方法run(),用来定义初始化逻辑。

Runner接口的主要作用是能够让开发者在Spring应用启动之后,进行一些自己想要的初始化操作。

这里所说的Runner接口是由SpringBoot提供的,包含 ApplicationRunnerCommandLineRunner

springboot 接口过段时间就阻塞 springboot常用接口_初始化

从目录和代码层面看,这两个接口互相没有任何从属关系,且从接口内容上看,也只有入参的类型不同:

@FunctionalInterface  
public interface ApplicationRunner {  
    void run(ApplicationArguments args) throws Exception;  
}
@FunctionalInterface  
public interface CommandLineRunner {  
    void run(String... args) throws Exception;  
}

之所以将这两者放在一起讨论,是因为他们在Spring项目启动时,扮演了相似的功能角色。

使用方法也十分简单:实现 CommandLineRunner 或者 ApplicationRunner 接口,并重写un()方法即可。
在run()方法中,我们可以通过Autowired注入一些服务或数据源,并进行一些初始化操作,代码如下:

@Component
public class DataInitializer implements CommandLineRunner {

    @Autowired
    private SomeService someService;

    @Override
    public void run(String... args) throws Exception {
        // 初始化数据
        myService.initializeData();
    }
}

2、二者的区别

从包路径和接口内容两个方面来看,CommandLineRunner 与 ApplicationRunner接口整体上略有相似,但又不是完全相同。

对于二者的区别,我们可以从调用入口接口入参两个角度来进行理解:

2.1、调用入口

在Spring启动的run方法中,我们可以看到,在run方法的最后,callRunner方法里面,从Spring上下文中获取到了所有的ApplicationRunner类型和CommandLineRunner类型的Bean。

springboot 接口过段时间就阻塞 springboot常用接口_spring boot_02

再将这些类型的Bean放到一个runner集合中,循环遍历并调用各自的run方法。

springboot 接口过段时间就阻塞 springboot常用接口_java_03

2.2、接口入参

ApplicationRunner接口 和 CommandLineRunner接口都是函数式接口,只有一个run()方法。

二者的区别在于参数不同。

ApplicationRunner中run()参数是ApplicationArguments对象。

springboot 接口过段时间就阻塞 springboot常用接口_命令行参数_04

CommandLineRunner中run()参数是数量可变的字符串。

springboot 接口过段时间就阻塞 springboot常用接口_spring_05

Spring类型的入参我们很好理解,方法可以接收任意数量的字符串参数。

ApplicationArguments类型的入参在这里需要说明一下。

该类型是Spring Boot提供的一个类,用于获取应用程序启动时传入的命令行参数。它包含了以下信息:

1、命令行参数:包括长选项(例如 --foo)和短选项(例如 -f)。
2、非选项参数:即以空格分隔的非选项参数,例如文件名、路径等。
3、选项参数的值:如果一个选项参数需要一个值,例如 --foo=bar,那么这个值将存储在ApplicationArguments中。

使用ApplicationArguments可以轻松地获取和处理命令行参数,从而实现更加灵活的应用程序配置和启动。