springboot的ApplicationRunner和CommandLineRunner

本文详细探讨了Spring Boot中ApplicationRunner与CommandLineRunner的区别及执行顺序。揭示了ApplicationRunner默认先于CommandLineRunner执行的现象,并对比了两者如何处理外部参数的不同方式。

当我们希望在springboot容器后,执行一些操作的时候,我们可以考虑使用ApplicationRunner或者CommandLineRunner

问题:

  1. ApplicationRunner与CommandLineRunner谁先执行
  2. 两者的区别在哪
  3. 多个CommandLineRunner 执行顺序问题
1.ApplicationRunner与CommandLineRunner谁先执行。

我们在一个应用中分别实现两个接口

    @Component
    public class CommandLineRunnerTest implements CommandLineRunner {

	@Override
	public void run(String... arg0) throws Exception {
		System.out.println("CommandLineRunner=====执行开始");
		    for (int i = 0; i < arg0.length; i++) {
			    System.out.println(arg0[i]);
		    }
		System.out.println("CommandLineRunner=====执行完毕");

	    }

    }
复制代码
    @Component
    public class ApplicationRunnerTest implements ApplicationRunner {
    
    	@Override
    	public void run(ApplicationArguments arg0) throws Exception {
    		System.out.println("ApplicationRunner=====执行开始");
    		System.out.println(arg0.getNonOptionArgs());
    		System.out.println(arg0.getOptionNames());
    		System.out.println("ApplicationRunner=====执行完成");
    
    	}
    
    }
复制代码

从执行结果来看,ApplicationRunner默认先于CommandLineRunner执行

    ApplicationRunner=====执行开始
    []
    [name, age]
    [lisi]
    ApplicationRunner=====执行完成
    CommandLineRunner=====执行开始
    --name=lisi
    --age=12
    CommandLineRunner=====执行完毕
复制代码
2.两者的区别,以及与main方法的联系

两个接口中都有run方法,负责接收来自应用外部的参数,ApplicationRunner的run方法会将外部参数封装成一个ApplicationArguments对象,而CommandLineRunner接口中run方法的参数则为String数组。

我们再回头看看main方法

    @SpringBootApplication
    public class AliyunmqApplication {
    
    	public static void main(String[] args) {
    		System.out.println("main方法==========执行开始");
    		for (int i = 0; i < args.length; i++) {			
    			System.out.println(args[i]);			
    		}
    		System.out.println("main方法==========执行完毕");
    		SpringApplication.run(AliyunmqApplication.class, args);
    	}
    }
复制代码

我们看到main方法也是接收一个args 数组参数。

执行发现:

    main方法==========执行开始
    --name=lisi
    --age=12
    main方法==========执行完毕
    ..............
    ..............
    ApplicationRunner=====执行开始
    []
    [name, age]
    [lisi]
    ApplicationRunner=====执行完成
    CommandLineRunner=====执行开始
    --name=lisi
    --age=12
    CommandLineRunner=====执行完毕
复制代码

main方法的arg参数 和 CommandLineRunner方法的arg数组的值是一样的。

总的来看: ApplicationRunner run方法中的ApplicationArguments 对象,对输入参数做了封装,让我们可以使用 get**()的形式获取参数。CommandLineRunner run方法的arg数组则是原装。

以eclipse为例看参数设置:

3. 多个实现类的执行顺序

两种方法

  • 使用@Order(value=整数值)
  • 实现Ordered接口,在方法里return 一个顺序值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值