在日常的项目开发中经常会遇到这样的需求:项目启动的时候进行一些一次性的初始化工作,如读取加载资源文件、或者执行其它外部程序。
这个时候我们就可以用到spring-boot为我们提供的一种扩展机制--Runner。
在spring-boot中提供了两种Runner接口:ApplicationRunner和CommandLineRunner,接下来我们就看看他们都是怎么使用的
Runner的使用
要想在我们的项目中使用ApplicaitonRunner和CommandLineRunner只需要实现如下代码即可:
从代码中我们可以看出使用上是非常方便的,只需要实现相应的接口类,然后创建bean即可。上面的代码的输出结果为:
ApplicaitonRunner和CommandLineRunner相比,它们虽然都只有一个run接口,但是各自接收的参数类型却不一样,这也是他们唯一的区别。
- CommandLineRunner的run方法接收的是一个String类型的可变参数,它的值就是我们main函数接收到的命令行参数。
- ApplicaitonRunner的run方法接收一个ApplicationArguments类型的参数,ApplicationArguments会对spring-boot程序的启动参数进行解析和分类,把[--{operation-name}={operation-value}]解析操作参数,其它情况被分类为非操作参数。
--op1=value1 --op2=value2 arg1 arg2
操作类参数:op1---值为value2,op2---值为value2
非操作参数:arg1,arg2
Runner的实现原理
spring-boot的runner扩展的实现也是非常的简单的。写过spring-boot程序的朋友一定对SpringApplication.run方法影响深刻,我们今天讲的runner也是在这个方法中被调用的。整个调用过程:
- SpringApplication.run调用callRunners方法
- 查找实现了ApplicationRunner和CommandLineRunner接口的Bean,统一存放在一个list中
- 根据Bean的order进行排序
- 循环调用每一个Runner Bean的run接口。
实现过程的核心代码: