概述
深入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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复