【发布时间】:2012-03-05 06:49:43
【问题描述】:
我需要根据当前不同的环境配置文件编写不同的逻辑。
如何从 Spring 获取当前活动和默认配置文件?
【问题讨论】:
-
@aweigold:在 spring 3.1 中以编程方式获取当前活动/默认环境配置文件。您还需要什么详细信息?
标签: java spring spring-profiles
我需要根据当前不同的环境配置文件编写不同的逻辑。
如何从 Spring 获取当前活动和默认配置文件?
【问题讨论】:
标签: java spring spring-profiles
如前所述。您可以自动装配环境:
@Autowired
private Environment environment;
只有您可以更轻松地检查所需的环境:
if (environment.acceptsProfiles(Profiles.of("test"))) {
doStuffForTestEnv();
} else {
doStuffForOtherProfiles();
}
【讨论】:
扩展 User1648825 的不错的简单答案:
@Value("${spring.profiles.active}")
private String activeProfile;
如果没有设置配置文件(我得到一个空值),这可能会引发 IllegalArgumentException。如果您需要设置它,这可能是一件好事;如果不使用 @Value 的“默认”语法,即:
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
...如果 spring.profiles.active 无法解析,activeProfile 现在包含“未知”
【讨论】:
如果你既不想使用@Autowire 也不想注入@Value,你可以简单地做(包括后备):
System.getProperty("spring.profiles.active", "unknown");
这将返回任何活动配置文件(或回退到“未知”)。
【讨论】:
似乎需要能够静态访问它。
我怎样才能在非弹簧管理的静态方法中得到这样的东西 上课? – Aetherus
这是一个 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;
}
}
【讨论】:
这里有一个更完整的例子。
自动装配环境
首先,您需要自动装配环境 bean。
@Autowired
private Environment environment;
检查配置文件是否存在于活动配置文件中
然后您可以使用getActiveProfiles() 来查明该配置文件是否存在于活动配置文件列表中。这是一个示例,它从 getActiveProfiles() 获取 String[],从该数组中获取一个流,然后使用匹配器检查多个配置文件(不区分大小写),如果它们存在则返回一个布尔值。
//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
【讨论】:
【讨论】:
@Value("${spring.profiles.active}")
private String activeProfile;
它有效,您无需实施 EnvironmentAware。但我不知道这种方法的缺点。
【讨论】:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile 时可能考虑的所有配置文件。应用程序还可以使用spring.profiles.include 属性,并且可以在初始化期间使用ConfigurableEnvironment 以编程方式设置配置文件。 Environment.getActiveProfiles() 将获得使用任何这些机制设置的配置文件的完整列表。
如果您不使用自动装配,只需实现 EnvironmentAware
【讨论】: