窥探-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类进行参数的判断操作
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值