场景
有一个SpringBoot项目需要在启动后请求另一个远程服务拿取配置,而不是加载过程中去请求,可能会出现类没有实例化的场景,因此需要实现项目完全启动后再进行请求的场景。
解决
一般会有两种实现方式:
实现ApplicationRunner接口
代码语言:javascript复制@Component
public class ConsumerRunner implements ApplicationRunner{
@Override
public void run(ApplicationArgumers args) throws Exception{
//逻辑
System.out.println("SpringBoot项目启动后执行");
}
}
若有多个代码段需要执行,可用@Order注解设置执行的顺序,值越小越先执行添加如@Order(value=1)
实现CommandLineRunner接口
代码语言:javascript复制@Component
public class CommandLineRunnerBean implements CommandLineRunner {
@Override
public void run(String... args) {
String strArgs = Arrays.stream(args).collect(Collectors.joining("|"));
不同之处在于CommandLineRunner接口的run()方法接收String数组作为参数,即是最原始的参数,没有做任何处理;而ApplicationRunner接口的run()方法接收ApplicationArguments对象作为参数,是对原始参数做了进一步的封装。