0

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

服务端口=9800

DEV_SERVICE_PORT=7800

UAT_SERVICE_PORT=6600

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

我们想改变这一点,以便我们只检测活动的 Spring Profile 而不是使用 IP。我们的 web.xml 中有一个自定义的 ApplicationContextIniitalizer,它检测指示我们环境类型的 java System 属性。

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

  1. 创建一个 StandardEnvironment 的实例
  2. 调用 getActiveProfiles()

(2) 似乎总是返回一个空数组。这意味着属性占位符解析发生在任何 Spring 配置文件被激活之前。这个对吗??

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

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

4

1 回答 1

1

在 an 中管理的 BeanApplicationContext可以注册为 EnvironmentAware或者@InjectEnvironment,以便直接查询配置文件状态或解析属性。

[来源:Environmentjavadocs ]

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

于 2012-11-15T17:15:59.567 回答