1

Spring 3.1 PropertySourcesPlaceholderConfigurer javadoc说:

此类被设计为PropertyPlaceholderConfigurerSpring 3.1 应用程序的通用替代品。

但是我没有看到一种明显的方法来复制PropertyPlaceholderConfigurer's searchSystemEnvironment属性的功能,这使得配置器在找不到与占位符名称匹配的系统属性时查找环境变量。

请注意,我在 SO 上看到了很多关于“环境变量”的问题,PropertySourcesPlaceholderConfigurer但我看到的每个问题实际上都是在询问系统属性,而不是环境变量。

我如何告诉PropertySourcesPlaceholderConfigurer回退到使用环境变量提供占位符值?

4

1 回答 1

2

首先要注意的是Javadoc中的这个片段

任何本地属性(例如,通过 等添加 PropertiesLoaderSupport.setProperties(java.util.Properties)PropertiesLoaderSupport.setLocations(org.springframework.core.io.Resource...) 属性)都添加为PropertySource. 本地属性的搜索优先级基于属性的值,localOverride默认情况下为 false,这意味着在所有环境属性源之后,将最后搜索本地属性。

换句话说,它PropertySourcesPlaceholderConfigurer有自己的本地属性源,默认情况下,它会在直接在环境中注册的属性源之后搜索,即。类型的实例ConfigurableEnvironment

ConfigurableEnvironment, in getSystemPropeties()and的 JavadocgetSystemEnvironment()继续说

System.getProperties()如果当前允许,则 返回 的值SecurityManager,否则返回映射实现,该实现将尝试使用对 的调用来访问各个键 System.getProperty(String)

请注意,大多数Environment实现将包含此系统属性映射作为PropertySource要搜索的默认值。

[...]

如果当前 SecurityManager 允许,则返回 的值System.getenv(),否则返回映射实现,该实现将尝试使用调用来访问单个键System.getenv(String)

请注意,大多数Environment实现都会将此系统环境映射作为默认PropertySource搜索。

这些Environment实现StandardEnvironment,这是 Spring 的默认ApplicationContext类使用。

此类 Javadoc 指出

除了ConfigurableEnvironment属性解析和配置文件相关操作等常用功能外,此实现还配置了两个默认属性源,按以下顺序搜索:

  • 系统属性
  • 系统环境变量

也就是说,如果键"xyz"同时存在于 JVM 系统属性以及当前进程的环境变量集中,则"xyz"系统属性中键的值将从对environment.getProperty("xyz"). 默认情况下选择此顺序是因为系统属性是每个 JVM 的,而环境变量在给定系统上的许多 JVM 中可能是相同的。给予系统属性优先权允许在每个 JVM 的基础上覆盖环境变量。

这些属性源是可变的和可重新排序的。但是,为了回答您的问题,默认情况下已经提供了您请求的行为。

于 2017-09-18T17:12:43.440 回答