如何使用 Spring 的"属性源占位符配置器"来读取环境变量而不是系统属性



弹簧3.1 PropertySourcesPlaceholderConfigurer javadoc说:

此类设计为在弹簧3.1应用中的PropertyPlaceholderConfigurer的一般替代品。

但我看不到复制PropertyPlaceholderConfigurer'S searchSystemenvironment 属性的功能的明显方法,这使配置者在没有系统属性时查找环境变量可以找到占位符的名称。

请注意,我已经看到了很多有关"环境变量"和PropertySourcesPlaceholderConfigurer的问题,但是我看到的每个人都是实际询问系统属性,而不是环境变量。p>我如何告诉 PropertySourcesPlaceholderConfigurer使用环境变量回到占位持有人值?

firs要注意的是javadoc

的这个片段

任何本地属性(例如,通过 PropertiesLoaderSupport.setProperties(java.util.Properties)PropertiesLoaderSupport.setLocations(org.springframework.core.io.Resource...) 等)添加为PropertySource。本地搜索优先级 属性基于localOverride属性的值 默认是错误的,含义要搜索本地属性 最后,在所有环境属性源之后。

换句话说, PropertySourcesPlaceholderConfigurer具有其自己的 local 属性源,默认情况下,在属性源直接在环境中注册的属性来源,即。ConfigurableEnvironment类型的实例。

ConfigurableEnvironmentgetSystemEnvironment()中的CC_12的Javadoc继续说

如果当前允许,返回System.getProperties()的值 SecurityManager,否则返回将 尝试使用呼叫访问单个键 System.getProperty(String)

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

[...]

如果当前允许,返回System.getenv()的值 SecurityManager,否则将返回一个地图实现,将 尝试使用System.getenv(String)

的呼叫访问单个键

请注意,大多数Environment实现将包括此系统 环境图作为要搜索的默认PropertySource

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

这个类Javadoc状态

除了ConfigurableEnvironment的通常功能之外 作为财产分辨率和与个人资料相关的操作,此 实现配置两个默认属性源,要搜索 按照以下顺序:

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

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

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

最新更新