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

Posted

技术标签:

【中文标题】如何在 Spring 中以编程方式获取当前的活动/默认环境配置文件?【英文标题】:How do you get current active/default Environment profile programmatically in Spring? 【发布时间】:2012-03-05 06:49:43 【问题描述】:

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

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

【问题讨论】:

@aweigold:在 spring 3.1 中以编程方式获取当前活动/默认环境配置文件。您还需要什么详细信息? 【参考方案1】:

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

@Autowired
private Environment environment;

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

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

【讨论】:

【参考方案2】:

扩展 User1648825 的不错的简单答案:

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

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

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

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

【讨论】:

配置文件名称用逗号分隔。结帐baeldung.com/spring-profiles#2-using-springactiveprofile【参考方案3】:

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

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

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

【讨论】:

这对我不起作用。【参考方案4】:

似乎需要能够静态访问它。

我怎样才能在非弹簧管理的静态方法中得到这样的东西 上课? – 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;
    

【讨论】:

谢谢!这很有帮助,因为我需要在静态方法上使用它!【参考方案5】:

这里有一个更完整的例子。

自动装配环境

首先,您需要自动装配环境 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

【讨论】:

@Profile 似乎是最好的解决方案。【参考方案6】:

您可以自动连接Environment

@Autowired
Environment env;

Environment 提供:

String[] getActiveProfiles(), String[] getDefaultProfiles()boolean acceptsProfiles(String... profiles)

【讨论】:

我怎样才能在 non-spring-managed 类的 static 方法中得到这样的东西? 我会尝试将配置文件名称添加为方法参数并从调用类传递它。【参考方案7】:
@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" 非常适合我。使用 Spring Boot 1.5.15。 我认为如果定义了profile,就会解析value,否则会出现异常。不适合所有情况。 活动配置文件也可以是一个数组,请注意。使用这种方式,您可能会在添加其他配置文件时遇到意外错误。 这种方法的缺点是它不会获得 Spring 在评估 @Profile 时可能考虑的所有配置文件。应用程序还可以使用spring.profiles.include 属性,并且可以在初始化期间使用ConfigurableEnvironment 以编程方式设置配置文件。 Environment.getActiveProfiles() 将获得使用任何这些机制设置的配置文件的完整列表。【参考方案8】:

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

【讨论】:

以上是关于如何在 Spring 中以编程方式获取当前的活动/默认环境配置文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何在 iOS 6 中以编程方式获取设备的当前方向?

在android中以编程方式获取屏幕密度?

在 ios 中以编程方式获取墙纸