我们的配置文件有一个特定的格式,而不是有多个文件 - 即 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() 时,似乎还没有任何活动配置文件!我正在做的检测活动配置文件是:
- 创建一个 StandardEnvironment 的实例
- 调用 getActiveProfiles()
(2) 似乎总是返回一个空数组。这意味着属性占位符解析发生在任何 Spring 配置文件被激活之前。这个对吗??
何时设置活动配置文件,与 Spring 上下文加载期间的其他事件相关,如创建 bean、加载属性文件等?
是否可以在调用 resolvePlaceHolder() 时检测到活动配置文件?我应该扩展另一个类吗?