栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot源码解析(六)ActiveProfiles初始化

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot源码解析(六)ActiveProfiles初始化

本文主要对上篇文章剩下的一个点做个收尾
上文分析了配置的优先级,涉及到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 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 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 activeProfiles = new linkedHashSet();

然后将SpringApplication的additionalProfiles也添加到Environment的avtiveProfiles列表中
这个additionalProfiles默认是空的

public class SpringApplication {
	......
	......
	private Set 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来使用

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/684877.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号