207

我需要根据不同的当前环境配置文件编写不同的逻辑。

如何从 Spring 获取当前活动和默认配置文件?

4

8 回答 8

288

您可以自动连接Environment

@Autowired
Environment env;

Environment提供:

于 2012-02-13T21:08:19.820 回答
106

扩展 User1648825 的简单答案:

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

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

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

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

于 2018-01-29T11:40:46.867 回答
68

这是一个更完整的例子。

自动连线环境

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

@Autowired
private Environment environment;

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

然后,您可以使用getActiveProfiles()来确定配置文件是否存在于活动配置文件列表中。这是一个使用 from 的示例,String[]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")Profiles 实现类似的功能,该注释允许基于传入或环境参数进行选择性配置。以下是有关此技术的更多信息:Spring Profiles

于 2017-01-09T17:40:57.973 回答
33
@Value("${spring.profiles.active}")
private String activeProfile;

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

于 2017-09-18T13:23:44.210 回答
14

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

于 2012-11-13T13:43:18.877 回答
6

似乎有一些需求能够静态访问它。

我怎样才能在非弹簧管理类的静态方法中得到这样的东西?– 埃瑟鲁斯

这是一个 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;
    }
}
于 2020-04-17T13:53:37.433 回答
5

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

@Autowired
private Environment environment;

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

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

} else {
    doStuffForOtherProfiles();
}
于 2020-12-23T12:01:01.083 回答
1

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

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

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

于 2021-02-19T09:07:20.873 回答