如何在Spring中以编程方式获取当前的活动/默认环境配置文件?


155

我需要根据不同的当前环境配置文件编写不同的逻辑。如何从Spring获取当前的活动和默认配置文件?


3
@aweigold:在Spring 3.1中以编程方式获取当前的活动/默认环境配置文件。您还需要什么详细信息?
Bobo 2012年

Answers:



75

扩展User1648825的简单答案(我无法发表评论,我的编辑被拒绝了):

@Value("${spring.profiles.active}")
private String activeProfile;

如果未设置任何配置文件,则可能抛出IllegalArgumentException(我得到一个空值)。如果您需要设置它,这可能是一件好事。如果不对@Value使用'default'语法,即:

@Value("${spring.profiles.active:Unknown}")
private String activeProfile;

如果无法解析spring.profiles.active,则... activeProfile现在包含'未知'


配置文件名称用逗号分隔。结帐baeldung.com/spring-profiles#2-using-springactiveprofile
Jason,

56

这是一个更完整的示例。

汽车线环境

首先,您将要自动连接环境bean。

@Autowired
private Environment environment;

检查活动配置文件中是否存在配置文件

然后,您可以使用getActiveProfiles()查找配置文件是否存在于活动配置文件列表中。这是一个示例,它使用String[]from getActiveProfiles(),从该数组获取一个流,然后使用匹配器检查多个配置文件(不区分大小写),如果存在则返回一个布尔值。

//Check if Active profiles contains "local" or "test"
if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
   env -> (env.equalsIgnoreCase("test") 
   || env.equalsIgnoreCase("local")) )) 
{
   doSomethingForLocalOrTest();
}
//Check if Active profiles contains "prod"
else if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
   env -> (env.equalsIgnoreCase("prod")) )) 
{
   doSomethingForProd();
}

您还可以使用注释实现类似的功能。@Profile("local")配置文件允许根据传入的或环境参数进行选择性配置。这是有关此技术的更多信息:Spring Profiles


2
@Profile似乎是最好的解决方案。
Paul Waldo

每个花括号中的分隔线使我不知所措。不是Java编码标准。
user1567291

26
@Value("${spring.profiles.active}")
private String activeProfile;

它可以工作,您不需要实现EnvironmentAware。但是我不知道这种方法的缺点。


3
此行给出此错误:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
zygimantus

非常适合我。使用Spring Boot 1.5.15。
рüффп

我认为,如果定义了配置文件,则将解析值,否则将出现异常。并不适合所有情况。
WesternGun

1
活动配置文件也可以是数组,请注意。使用这种方式,在添加其他配置文件时会出现意外错误。
Alex Efimov,

这种方法的缺点是不能获得Spring在评估时可能考虑的所有资料@Profile。应用程序还可以使用该spring.profiles.include 属性,并且可以在初始化期间使用来以编程方式设置配置文件ConfigurableEnvironmentEnvironment.getActiveProfiles()将使用这些机制中的任何一种获取配置文件集的完整列表。
Scott Frederick


0

似乎存在一些能够静态访问此请求的需求。

如何在非Spring管理的类的静态方法中获得此类信息?–以太

这是一个hack,但是您可以编写自己的类来公开它。您必须小心确保SpringContext.getEnvironment()在创建所有bean之前不会调用任何东西,因为不能保证何时实例化此组件。

@Component
public class SpringContext
{
    private static Environment environment;

    public SpringContext(Environment environment) {
        SpringContext.environment = environment;
    }

    public static Environment getEnvironment() {
        if (environment == null) {
            throw new RuntimeException("Environment has not been set yet");
        }
        return environment;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.