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