springboot如何获取启动命令行参数
1、我们有的场景下可能需要在springboot项目中通过命令行传递参数。那我们应该如何接收这部分参数呢。
就像上面的图片,传了参数1 2 3。
2、springboot主要接收两种参数
一种是-- 开头的,这一类参数还要区分 是否包含=
其他的都是另一种,文章开头的 1 2 3。两种参数是可以一起使用的。比如,你可以像下图一样使用
具体参数的解析在SimpleCommandLineArgsParser类的parse方法中
3、下面我们来具体看下是如何实现的。
- 我们的命令行参数是通过args这个参数传递给springboot的,
我们点进去这个run方法,看下参数具体是怎么使用的。
再点进去,发现参数会传递给SpringApplication这个类的run方法,这个run方法也就是springboot整个流程最外层的方法
上面图就是整个run方法,和参数相关的位置我都进行了标注。
2.下面分别说明
- 第1处:这里主要是创建SpringApplicationRunListener监听器,会把参数传递进构造方法。这个接口的用途就不打开来看了。
这是一个接口类,随便找个这个类的实现类看下,比如EventPublishingRunListener这个类,就会通过构造方法接收命令行参数。
这里就会通过args接收这个参数。这个类在每次事件广播时,将参数传递下去。
- 第2处:这里会创建一个DefaultApplicationArguments对象,将参数作为构造参数传递进去,在构造方法内,还会传递给Source类,同时通过属性来接收参数。
Source这个类是继承SimpleCommandLinePropertySource这个类,看名字就知道是做命令行参数处理的。
SimpleCommandLinePropertySource这个类会对参数做个简单的数据,返回的是 CommandLineArgs对象,我们传递的args是个数组,它会对每个元素判断是否是–开头,会加到optionArgs这个属性中,如果不是 就加载到nonOptionArgs这个里面。
而在run方法中prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);这个方法会把这里构造的applicationArguments对象传递给beanFactory
以后我们需要使用命令行参数,就可以通过自动注入applicationArguments来获取了。
这个ApplicationArguments有4个方法,其中能够返回命令行参数的有4个
第一个返回所有不带–的参数
第二个返回所有带–参数的key
第三个返回具体指定key的值
第四个返回原始的命令行入参数组
- 第3处,这里会把参数重新获取出来,封装到环境上下文中,也就是environment里面。加到environment里面的也是个SimpleCommandLinePropertySource对象
这样,我们就可以通过参数绑定之类获取到命令行参数
比如命令行传递了个```-name=abc``
代码中就可以通过参数绑定的方式来获取
- 第4处:这里主要是获取容器中ApplicationRunner,CommandLineRunner的所有对象,调用接口方法。这里的接口方法中的参数就是第2处中生成的对象。