springboot如何获取启动命令行参数

1、我们有的场景下可能需要在springboot项目中通过命令行传递参数。那我们应该如何接收这部分参数呢。

spring boot 启用调试 springboot启动参数_参数传递

就像上面的图片,传了参数1 2 3。

2、springboot主要接收两种参数

一种是-- 开头的,这一类参数还要区分 是否包含=

spring boot 启用调试 springboot启动参数_命令行参数_02

其他的都是另一种,文章开头的 1 2 3。两种参数是可以一起使用的。比如,你可以像下图一样使用

spring boot 启用调试 springboot启动参数_spring_03

具体参数的解析在SimpleCommandLineArgsParser类的parse方法中

spring boot 启用调试 springboot启动参数_java_04

3、下面我们来具体看下是如何实现的。
  1. 我们的命令行参数是通过args这个参数传递给springboot的,

spring boot 启用调试 springboot启动参数_参数传递_05

我们点进去这个run方法,看下参数具体是怎么使用的。

spring boot 启用调试 springboot启动参数_参数传递_06

再点进去,发现参数会传递给SpringApplication这个类的run方法,这个run方法也就是springboot整个流程最外层的方法

spring boot 启用调试 springboot启动参数_参数传递_07

spring boot 启用调试 springboot启动参数_命令行参数_08

上面图就是整个run方法,和参数相关的位置我都进行了标注。

2.下面分别说明

  • 第1处:这里主要是创建SpringApplicationRunListener监听器,会把参数传递进构造方法。这个接口的用途就不打开来看了。

这是一个接口类,随便找个这个类的实现类看下,比如EventPublishingRunListener这个类,就会通过构造方法接收命令行参数。

spring boot 启用调试 springboot启动参数_命令行参数_09

这里就会通过args接收这个参数。这个类在每次事件广播时,将参数传递下去。

  • 第2处:这里会创建一个DefaultApplicationArguments对象,将参数作为构造参数传递进去,在构造方法内,还会传递给Source类,同时通过属性来接收参数。

spring boot 启用调试 springboot启动参数_命令行参数_10

Source这个类是继承SimpleCommandLinePropertySource这个类,看名字就知道是做命令行参数处理的。

SimpleCommandLinePropertySource这个类会对参数做个简单的数据,返回的是 CommandLineArgs对象,我们传递的args是个数组,它会对每个元素判断是否是–开头,会加到optionArgs这个属性中,如果不是 就加载到nonOptionArgs这个里面。

spring boot 启用调试 springboot启动参数_参数传递_11

而在run方法中prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);这个方法会把这里构造的applicationArguments对象传递给beanFactory

spring boot 启用调试 springboot启动参数_java_12

以后我们需要使用命令行参数,就可以通过自动注入applicationArguments来获取了。

这个ApplicationArguments有4个方法,其中能够返回命令行参数的有4个

第一个返回所有不带–的参数

第二个返回所有带–参数的key

第三个返回具体指定key的值

第四个返回原始的命令行入参数组

spring boot 启用调试 springboot启动参数_spring_13

  • 第3处,这里会把参数重新获取出来,封装到环境上下文中,也就是environment里面。加到environment里面的也是个SimpleCommandLinePropertySource对象

spring boot 启用调试 springboot启动参数_spring boot 启用调试_14

spring boot 启用调试 springboot启动参数_参数传递_15

这样,我们就可以通过参数绑定之类获取到命令行参数

比如命令行传递了个```-name=abc``

spring boot 启用调试 springboot启动参数_spring boot 启用调试_16

代码中就可以通过参数绑定的方式来获取

spring boot 启用调试 springboot启动参数_spring boot 启用调试_17

  • 第4处:这里主要是获取容器中ApplicationRunner,CommandLineRunner的所有对象,调用接口方法。这里的接口方法中的参数就是第2处中生成的对象。