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

时间:2012-02-13 20:50:19

标签: java spring spring-profiles

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

9 个答案:

答案 0 :(得分:166)

您可以自动加载Environment

@Autowired
Environment env;

Environment提供:

答案 1 :(得分:38)

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

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

如果没有设置配置文件,我可能会抛出IllegalArgumentException(我得到一个空值)。如果您需要设置它,这可能是一件好事;如果不使用'默认' @Value的语法,即:

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

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

答案 2 :(得分:31)

这是一个更完整的例子。

自动环境

首先,您需要自动装配环境bean。

@Autowired
private Environment environment;

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

然后,您可以使用getActiveProfiles()查看配置文件是否存在于活动配置文件列表中。这是一个从String[]获取getActiveProfiles()的示例,从该数组中获取流,然后使用匹配器检查多个配置文件(Case-Insensitive),如果它们存在则返回一个布尔值。

//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

答案 3 :(得分:22)

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

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

答案 4 :(得分:13)

如果您不使用自动装配,只需实施EnvironmentAware

即可

答案 5 :(得分:3)

如果你既不想使用@Autowire 也不想注入@Value,你可以简单地做(包括后备):

System.getProperty("spring.profiles.active", "unknown");

这将返回任何活动配置文件(或回退到“未知”)。

答案 6 :(得分:2)

似乎有一些能够静态访问此请求的要求。

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

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

@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;
    }
}

答案 7 :(得分:2)

如前所述。您可以自动装配环境:

@Autowire
private Environment environment;

只有您可以更轻松地检查所需的环境:

if (environment.acceptsProfiles(Profiles.of("test"))) {
    doStuffForTestEnv();
} else {
    doStuffForOtherProfiles();
}

答案 8 :(得分:0)

要进行一些调整以处理未设置变量的情况,可以使用默认值

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

这样,如果设置了spring.profiles.active,它将采用默认值unknown

因此不会触发任何异常。无需在测试中强行添加@ActiveProfiles("test")之类的东西即可通过。