代码位置
SpringApplication
类的实例方法run
方法,第300行
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
相关类
ApplicationArguments
DefaultApplicationArguments
Source
SimpleCommandLinePropertySource
SimpleCommandLineArgsParser
解析
public SimpleCommandLinePropertySource(String... args) {
super(new SimpleCommandLineArgsParser().parse(args));
}
public CommandLineArgs parse(String... args) {
CommandLineArgs commandLineArgs = new CommandLineArgs();
for (String arg : args) {
if (arg.startsWith("--")) {
String optionText = arg.substring(2);
String optionName;
String optionValue = null;
int indexOfEqualsSign = optionText.indexOf('=');
if (indexOfEqualsSign > -1) {
optionName = optionText.substring(0, indexOfEqualsSign);
optionValue = optionText.substring(indexOfEqualsSign + 1);
}
else {
optionName = optionText;
}
if (optionName.isEmpty()) {
throw new IllegalArgumentException("Invalid argument syntax: " + arg);
}
commandLineArgs.addOptionArg(optionName, optionValue);
}
else {
commandLineArgs.addNonOptionArg(arg);
}
}
return commandLineArgs;
}
主要逻辑:
命令行参数分为两种参数:选项参数
和非选项参数
选项参数特点:以--
开头,中间可以有=
,也可以没有
不以--
开头的就是非选项参数
比如:--foo=value
会解析为选项参数,参数名为foo,参数值为value
但是如果写成了--=
或者只有--
,就会抛出异常。
最后参数放入了CommandLineArgs
类的实例之中。
CommandLineArgs
再被放入Source
中,参数名是commandLineArgs
Source
的类结构
继承:
SimpleCommandLinePropertySource
CommandLinePropertySource
EnumerablePropertySource
PropertySource