如何使用Spring的`PropertySourcesPlaceholderConfigurer`来读取环境变量NOT系统属性

时间:2017-09-18 16:48:06

标签: java spring environment-variables property-placeholder

Spring 3.1 PropertySourcesPlaceholderConfigurer javadoc说:

  

此类被设计为Spring 3.1应用程序中PropertyPlaceholderConfigurer的一般替代。

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

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

如何判断PropertySourcesPlaceholderConfigurer是否回退使用环境变量提供占位符值?

1 个答案:

答案 0 :(得分:1)

首先要注意的是Javadoc

中的这个片段
  

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

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

getSystemPropeties()getSystemEnvironment()ConfigurableEnvironment的Javadoc继续说

  

如果当前允许,则返回System.getProperties()的值   SecurityManager,否则返回将要执行的地图实现   尝试使用调用来访问各个键   System.getProperty(String)

     

请注意,大多数Environment实施都会包含此系统   属性映射为要搜索的默认PropertySource

     

[...]

     

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

调用来访问各个键      

请注意,大多数Environment实施都会包含此系统   环境地图作为默认PropertySource 进行搜索。

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

这个类Javadoc陈述

  

ConfigurableEnvironment这样的常用功能外   作为属性解析和与配置文件相关的操作,这个   实现配置要搜索的两个默认属性源   按以下顺序:

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

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

这些财产来源是可变的和可重新订购的。但是,要回答您的问题,默认情况下已提供您请求的行为。