前言
本文目的是探究CommandLineRunner、ApplicationRunner接口(以下简称Runner接口)作用、区别以及使用场景。
作用
Runner接口由SpringBoot提供,在SpringApplication.run()方法中调用,因此通过实现Runner接口自定义初始化任务。
应用场景
在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等。可以通过实现Runner接口完成以上工作。
区别
下图中两个接口都只有run()抽象方法,区别在于参数不同,CommandLineRunner中run()参数是数量可变的字符串,CommandLineRunner中run()参数是ApplicationArguments对象,那么这两种参数有什么区别?
我们实现了这两个接口,并在启动程序时传入两种参数“--参数1=1 参数2 参数3”,对比两个接口对参数的不同处理
CommandLineRunner实现
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("------------开始调用CommandLineRunner------------");
for (String arg:args){
System.out.println(" "+arg);
}
System.out.println("++++++++++++结束调用CommandLineRunner++++++++++++");
}
}
日志输出
ApplicationRunner实现
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("------------开始调用ApplicationRunner------------");
String[] sourceArgs = args.getSourceArgs();
for (String arg:sourceArgs){
System.out.println(" "+arg);
}
System.out.println(" -----------------option---------------- ");
Set<String> optionNames = args.getOptionNames();
for (String s: optionNames) {
System.out.println(" optionName:"+s+" optionValue:"+args.getOptionValues(s));
}
System.out.println("++++++++++++结束调用ApplicationRunner++++++++++++");
}
}
日志输出
结论
通过日志可以看出最大区别是ApplicationArgument会将“--option=value”格式的参数解析,并通过optionName获取value值。
补充
执行顺序
通过在实现类上添加@order()标签决定接口的的调用顺序