SpringBoot源码解析(六)ActiveProfiles初始化
Environment中有个属性ActiveProfiles,是将来要激活的配置本文主要对上篇文章剩下的一个点做个收尾上篇文章讲了配置的优先级,主要涉及到getOrCreateEnvironment和configureEnvironment两个方法其中configureEnvironment方法还剩最后一行configureProfiles没有提到protected void configureE
本文主要对上篇文章剩下的一个点做个收尾
上文分析了配置的优先级,涉及到getOrCreateEnvironment和configureEnvironment两个方法
其中configureEnvironment方法还剩最后一行configureProfiles没有提到
protected void configureEnvironment(ConfigurableEnvironment environment, String[] args) {
if (this.addConversionService) {
ConversionService conversionService = ApplicationConversionService.getSharedInstance();
environment.setConversionService((ConfigurableConversionService)conversionService);
}
this.configurePropertySources(environment, args);
this.configureProfiles(environment, args);
}
这个方法用来设置Environment中的activeProfiles属性,它是将来要激活的配置列表
进入方法实现
protected void configureProfiles(ConfigurableEnvironment environment, String[] args) {
environment.getActiveProfiles();
Set<String> profiles = new LinkedHashSet(this.additionalProfiles);
profiles.addAll(Arrays.asList(environment.getActiveProfiles()));
environment.setActiveProfiles(StringUtils.toStringArray(profiles));
}
第一行获取当前环境中的spring.profiles.active属性,注意这里是到启动参数、系统配置、环境变量中找该属性,而不是加载我们项目的配置文件application.properties,此时配置文件还没开始加载
虽然有些项目也会在application.properties中指定该属性来开启不同配置,如application-dev.properties、application-fat.properties等,这个流程我们后续再介绍
public String[] getActiveProfiles() {
return StringUtils.toStringArray(this.doGetActiveProfiles());
}
protected Set<String> doGetActiveProfiles() {
Set var1 = this.activeProfiles;
synchronized(this.activeProfiles) {
if (this.activeProfiles.isEmpty()) {
String profiles = this.getProperty("spring.profiles.active");
if (StringUtils.hasText(profiles)) {
this.setActiveProfiles(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(profiles)));
}
}
return this.activeProfiles;
}
}
找到的话设置到Environment的activeProfiles属性中,该属性默认为一个空的Set
public abstract class AbstractEnvironment implements ConfigurableEnvironment {
......
......
private final Set<String> activeProfiles = new LinkedHashSet();
然后将SpringApplication的additionalProfiles也添加到Environment的avtiveProfiles列表中
这个additionalProfiles默认是空的
public class SpringApplication {
......
......
private Set<String> additionalProfiles;
SpringApplication提供了一个接口来设置这个列表
public void setAdditionalProfiles(String... profiles) {
this.additionalProfiles = new LinkedHashSet(Arrays.asList(profiles));
}
所以我们可以通过在启动类中先new出SpringApplication,然后调用该方法来指定要激活的配置文件
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(new Class[]{Application.class});
springApplication.setAdditionalProfiles("dev");
springApplication.run(args);
}
}
当然像这样在启动函数中调用setAdditionalProfiles方法,不如直接通过命令行参数指定spring.profiles.active属性,这里只是演示API的用法,实际项目中可以结合SpringBoot为我们提供的扩展点,比如之前提到的ApplicationStartingEvent来使用
更多推荐
所有评论(0)