本文主要对上篇文章剩下的一个点做个收尾
上文分析了配置的优先级,涉及到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来使用

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐