窥探-spring boot应用参数ApplciationArguments
在进行springboot开发的时候,我们启动的时候会使用run方法,代码如下:
public static void main(String ... args){
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.setBannerMode(Banner.Mode.OFF);
springApplication.run(args);
}
启动的时候会加载启动参数,如果我们需要访问这些参数的时候,就需要使用ApplciationArguments进行相关的操作。
简单使用
创建一个项目,我的项目结构如图:
我们需要获取相关的参数,我们创建了一个MyConfig类:
@Component
public class MyConfig {
private static final Logger logger = LoggerFactory.getLogger(MyConfig.class);
/***
* 如果您需要访问传递给SpringApplication.run(...)的应用程序参数,
* 则可以注入org.springframework.boot.ApplicationArguments bean。
* 通过ApplicationArguments接口,可以访问原始String []参数以及已解析的选项和非选项参数
*/
@Autowired
public MyConfig(final ApplicationArguments arguments) {
for(String args : arguments.getNonOptionArgs()){
logger.info(args);
}
final boolean debug = arguments.containsOption("debug");
logger.info("============debug mode:{}===========",debug);
}
}
这个是项目启动的时候会打印相关的参数,如下:
探索ApplciationArguments
ApplciationArguments是一个接口,这个接口提供访问运行参数,及run方法中的参数。
//返回传递给应用程序的未经处理的原始参数
String[] getSourceArgs();
//返回所有的操作参数,如--foo=bar --debug
Set<String> getOptionNames();
//返回从参数解析的选项参数集是否包含一个具有给定名称的选项
boolean containsOption(String name);
//返回与arguments选项关联的值的集合,该选项具有给定的名称
List<String> getOptionValues(String name);
//返回已解析的非选项参数的集合
List<String> getNonOptionArgs();
以上是这个接口中的方法,我们看看这个接口相关的实现类
DefaultApplicationArguments实现类
当前DefaultApplicationArguments实现了ApplicationArguments的相关方法
这些方法是通过内部类Source进行操作的,该类继承了SimpleCommandLinePropertySource类
SimpleCommandLinePropertySource根据名字可以看出这个类是进行命令行属性资源加载的,该类继承了CommandLinePropertySource,该类是一个抽象类,有三个子类,该类是加载相关命令行属性资源的类,CommandLinePropertySource有一个泛型为CommandLineArgs,CommandLineArgs这个类将处理相关的命令行参数。
相关获取参数的默认属性:
包含属性和得到属性:
该类最终的父类为PropertySource,进行加载相关表示名称/值属性对来源的抽象基类。
CommandLineArgs类
命令行参数的简单表示,分为“选项参数”和*“非选项参数”
class CommandLineArgs {
//存储选项参数
private final Map<String, List<String>> optionArgs = new HashMap<>();
//存储非选项参数
private final List<String> nonOptionArgs = new ArrayList<>();
/**
*为给定的选项名称添加一个选项参数,并将给定的值添加到与此选项关
联的值列表中(该值可以为零或更多)。给定的值可以为null,
指示该选项为 指定而没有关联值
*/
public void addOptionArg(String optionName, @Nullable String optionValue) {
if (!this.optionArgs.containsKey(optionName)) {
this.optionArgs.put(optionName, new ArrayList<>());
}
if (optionValue != null) {
this.optionArgs.get(optionName).add(optionValue);
}
}
/**
* 返回命令行中存在的所有选项参数的集合。
*/
public Set<String> getOptionNames() {
return Collections.unmodifiableSet(this.optionArgs.keySet());
}
/**
* 返回命令行上是否存在具有给定名称的选项。
*/
public boolean containsOption(String optionName) {
return this.optionArgs.containsKey(optionName);
}
/**
* 返回与给定选项关联的值列表 null表示该选项不存在 空列表表示没有值与此选项关联。
*/
@Nullable
public List<String> getOptionValues(String optionName) {
return this.optionArgs.get(optionName);
}
/**
* 将给定值添加到非选项参数列表中
*/
public void addNonOptionArg(String value) {
this.nonOptionArgs.add(value);
}
/**
* 返回命令行上指定的非选项参数列表
*/
public List<String> getNonOptionArgs() {
return Collections.unmodifiableList(this.nonOptionArgs);
}
}
怎么进行区分选项参数和非选项参数的呢?
在进行使用的时候,SimpleCommandLinePropertySource进行初始化的时候,会使用SimpleCommandLineArgsParser类进行参数的判断操作