PropertiesPlaceholderConfigurer子类可以检测活动的Spring配置文件吗?

时间:2012-11-15 17:09:55

标签: spring spring-environment spring-profiles

我们的配置文件有一个特定的格式,而不是拥有多个文件 - 即dev.properties,uat.properties,prod.properties - 我们将所有值都放在一个文件中,但每个文件都用前缀分隔环境。例如:

SERVICE_PORT = 9800

DEV_SERVICE_PORT = 7800

UAT_SERVICE_PORT = 6600

我们有一个现有的类(PropertyPlaceholderConfigurer的子类)来查找这些值,并根据它执行的IP地址决定在resolvePlaceHolder()中添加什么前缀,即对于某个IP范围,使用DEV_前缀,另一方面,使用UAT_前缀。然后将这些值传递给其他bean,在某些情况下使用上下文xml,在某些情况下使用@ Value $ {}注释传递给某些bean构造函数。前缀的使用是透明的,因此所有其他配置将使用SERVICE_PORT(在示例中)

我们希望更改此设置,以便我们只检测活动的Spring配置文件,而不是使用IP。我们的web.xml中有一个自定义的ApplicationContextIniitalizer,它可以检测指示我们的环境类型的java System属性。

我遇到的问题是,当调用resolvePlaceHolder()时,似乎还没有任何活动配置文件!我正在做的检测活动配置文件的是:

  1. 创建StandardEnvironment的实例
  2. 调用getActiveProfiles()
  3. (2)似乎总是返回一个空数组。这意味着在激活任何Spring配置文件之前,会发生Propertyplaceholder解析。它是否正确??

    活动配置文件何时设置,与Spring上下文加载期间的其他事件相关,如创建bean,加载属性文件等?

    是否可以在调用resolvePlaceHolder()时检测活动配置文件?我应该扩展另一个班吗?

1 个答案:

答案 0 :(得分:1)

  

ApplicationContext内管理的Bean可以注册为   EnvironmentAware@Inject环境以查询个人资料   直接声明或解决属性。

[来源:Environment javadocs]

不要创建StandardEnvironment的实例,将其注入您的bean!