1、基本说明
SpringBoot中的Runner接口是用来在Spring应用启动后执行一些初始化逻辑的接口。
它是一个函数式接口,只有一个方法run(),用来定义初始化逻辑。
Runner接口的主要作用是能够让开发者在Spring应用启动之后,进行一些自己想要的初始化操作。
这里所说的Runner接口是由SpringBoot提供的,包含 ApplicationRunner
与 CommandLineRunner
从目录和代码层面看,这两个接口互相没有任何从属关系,且从接口内容上看,也只有入参的类型不同:
@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。
再将这些类型的Bean放到一个runner集合中,循环遍历并调用各自的run方法。
2.2、接口入参
ApplicationRunner接口 和 CommandLineRunner接口都是函数式接口,只有一个run()方法。
二者的区别在于参数不同。
ApplicationRunner中run()参数是ApplicationArguments对象。
CommandLineRunner中run()参数是数量可变的字符串。
Spring类型的入参我们很好理解,方法可以接收任意数量的字符串参数。
ApplicationArguments类型的入参在这里需要说明一下。
该类型是Spring Boot提供的一个类,用于获取应用程序启动时传入的命令行参数。它包含了以下信息:
1、命令行参数:包括长选项(例如 --foo)和短选项(例如 -f)。
2、非选项参数:即以空格分隔的非选项参数,例如文件名、路径等。
3、选项参数的值:如果一个选项参数需要一个值,例如 --foo=bar,那么这个值将存储在ApplicationArguments中。
使用ApplicationArguments可以轻松地获取和处理命令行参数,从而实现更加灵活的应用程序配置和启动。