我是靠谱客的博主 害怕外套,最近开发中收集的这篇文章主要介绍深入SpringBoot源码(四)初识Environment,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

深入SpringBoot源码(四)初识Environment

    • new DefaultApplicationArguments
    • prepareEnvironment
      • getOrCreateEnvironment()
      • ConfigurableEnvironment
      • Environment

new DefaultApplicationArguments

在这里插入图片描述
ApplicationArguments提供对用于运行SpringApplication的参数的访问。

public interface ApplicationArguments {

	/**
	 * 返回传递给应用程序的原始未处理参数。
	 */
	String[] getSourceArgs();

	/**
	 * 返回所有选项参数的名称。例如,如果参数是 "--foo=bar --debug" 将返回值["foo", "debug"] 。
	 */
	Set<String> getOptionNames();

	/**
	 * 返回从参数解析的选项参数集是否包含具有给定名称的选项。
	 * @param name 要检查的名称
	 */
	boolean containsOption(String name);

	/**
	 * 返回与具有给定名称的参数选项关联的值的集合
	 * @param name 选项的名称
	 */
	List<String> getOptionValues(String name);

	/**
	 * 返回已解析的非选项参数的集合。
	 */
	List<String> getNonOptionArgs();

}

DefaultApplicationArguments是ApplicationArguments的默认实现。

prepareEnvironment

在这里插入图片描述

	private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,
			DefaultBootstrapContext bootstrapContext, ApplicationArguments applicationArguments) {
		// Create and configure the environment
		ConfigurableEnvironment environment = getOrCreateEnvironment();
		configureEnvironment(environment, applicationArguments.getSourceArgs());
		ConfigurationPropertySources.attach(environment);
		listeners.environmentPrepared(bootstrapContext, environment);
		DefaultPropertiesPropertySource.moveToEnd(environment);
		Assert.state(!environment.containsProperty("spring.main.environment-prefix"),
				"Environment prefix cannot be set via properties.");
		bindToSpringApplication(environment);
		if (!this.isCustomEnvironment) {
			environment = convertEnvironment(environment);
		}
		ConfigurationPropertySources.attach(environment);
		return environment;
	}

run方法调用prepareEnvironment传入的参数内容如下:
在这里插入图片描述

getOrCreateEnvironment()

在这里插入图片描述

	private ConfigurableEnvironment getOrCreateEnvironment() {
		if (this.environment != null) {
			return this.environment;
		}
		switch (this.webApplicationType) {
		case SERVLET:
			return new ApplicationServletEnvironment();
		case REACTIVE:
			return new ApplicationReactiveWebEnvironment();
		default:
			return new ApplicationEnvironment();
		}
	}

ConfigurableEnvironment

ConfigurableEnvironment是大多数Environment类都将实现的配置接口。提供用于设置活动和默认配置文件以及操作基础属性源的工具。允许客户端通过ConfigurablePropertyResolver超级接口设置和验证所需属性、自定义转换服务等。Environment表示当前应用程序运行环境的接口,对应用程序环境的两个关键方面进行建模:配置文件和属性。

public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver {

	/**
	 * 指定为此Environment活动的配置文件集。在容器引导期间评估配置文件以确定是否应向容器注册bean定义。
	 */
	void setActiveProfiles(String... profiles);

	/**
	 * 将配置文件添加到当前的活动配置文件集中。
	 */
	void addActiveProfile(String profile);

	/**
	 * 如果没有其他配置文件通过setActiveProfiles显式激活,则指定默认激活的配置文件集。
	 */
	void setDefaultProfiles(String... profiles);

	/**
	 * 以可变形式返回此Environment的PropertySources ,允许操作在针对此Environment对象解析属性时应搜索的PropertySource对象集。
	 * 各种MutablePropertySources方法(例如addFirst 、 addLast 、 addBefore和addAfter允许对属性源排序进行细粒度控制。
	 */
	MutablePropertySources getPropertySources();

	/**
	 * 如果当前SecurityManager允许,则返回System.getProperties()的值,否则返回一个映射实现,该实现将尝试使用对System.getProperty(String)的调用来访问各个键。
	 */
	Map<String, Object> getSystemProperties();

	/**
	 * 如果当前SecurityManager允许,则返回System.getenv()的值,否则返回一个映射实现,该实现将尝试使用对System.getenv(String)的调用来访问各个键。
	 */
	Map<String, Object> getSystemEnvironment();

	/**
	 * 将给定父环境的活动配置文件、默认配置文件和属性源附加到此(子)环境各自的集合中。
	 */
	void merge(ConfigurableEnvironment parent);

}

环境对象的配置必须通过ConfigurableEnvironment接口完成,该接口从所有AbstractApplicationContext子类getEnvironment()方法返回。

Environment

public interface Environment extends PropertyResolver {

	/**
	 * 返回为此环境显式激活的配置文件集。配置文件用于创建要按条件注册的 bean 定义的逻辑分组,例如基于部署环境。
	 * 可以通过将“spring.profiles.active”设置为系统属性或调用ConfigurableEnvironment.setActiveProfiles(String...)来激活配置文件。
	 * 如果没有将配置文件明确指定为活动,则任何默认配置文件都将自动激活。
	 */
	String[] getActiveProfiles();

	/**
	 * 当没有明确设置活动配置文件时,默认情况下将配置文件集返回为活动状态。
	 */
	String[] getDefaultProfiles();

	/**
	 * @deprecated as of 5.1 in favor of {@link #acceptsProfiles(Profiles)}
	 */
	@Deprecated 
	boolean acceptsProfiles(String... profiles);

	/**
	 * 返回活动配置文件是否与给定的Profiles谓词匹配。
	 */
	boolean acceptsProfiles(Profiles profiles);

}

在这里插入图片描述
SpringApplication的getOrCreateEnvironment方法会根据成员字段webApplicationType生成合适的ConfigurableEnvironment,例如我引入了spring-boot-starter-webflux依赖,所以这里选择了ApplicationReactiveWebEnvironment
在这里插入图片描述

最后

以上就是害怕外套为你收集整理的深入SpringBoot源码(四)初识Environment的全部内容,希望文章能够帮你解决深入SpringBoot源码(四)初识Environment所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部