首先要注意的是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 的基础上覆盖环境变量。
这些属性源是可变的和可重新排序的。但是,为了回答您的问题,默认情况下已经提供了您请求的行为。