声明
本文翻译自 Spring Boot Reference Guide (https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/html) ,择其第 24.3. Application Property Files 以及 24.4. Profile-specific Properties。
应用属性文件
SpringApplication
从application.properties
文件载入属性时按以下位置读取并添加到 Spring Enviroment
:
- 当前目录下
/config
中的子目录 - 当前目录(jar 所在目录)
- classpath:
/config
包 - classpath 根
上列按优先级从上到下排序(高优先级的会覆盖低优先级的属性)。
同样地也可以使用 YAML (.yml) 文件代替 .properties
如果不想使用application.properties
作为配置文件名,也可以选择替换成其他的文件名,指定spring.config.name
环境属性。当然也可以通过spring.config.location
环境属性指定位置(由英文逗号分隔的目录列表或者文件路径)。
以下示例来说明如何指定不同的文件名:
java -jar myproject.jar --spring.config.name=myproject
以下示例来说明如何指定两个配置路径:
java -jar myproject.jar \
--spring.config.location=classpath:/default.properties,classpath:/override.properties
spring.config.name
和spring.config.location
都是最先阶段被使用的,来决定哪些文件需要加载,所以都必须定义为环境属性(特别是操作系统环境变量、系统属性,或者命令行参数)。
如果spring.config.location
包含目录(否则就是文件),则应当以/
作为结尾(在应用运行中,位置之中的配置载入之前,包括 profile-specific 文件名,会附加由spring.config.name
生成的名称)。在spring.config.location
指定为文件的则不支持 profile-specific 形式,且会被其他任何 profile-specific 属性覆盖。
配置路径会以倒序查找。默认地,配置的路径是classpath:/,classpath:/config/,file:./,file:./config/
,那么其最终查找路径依次是:
file:./config/
file:./
classpath:/config/
classpath:/
当自定义的配置路径是通过spring.config.location
配置时,就会替换上述默认路径。例如,spring.config.location
的值是classpath:/custom-config/,file:./custom-config/
,那么查找结果的顺序则依下:
file:./custom/config/
classpath:custom-config/
又或者,当自定义的配置路径是通过spring.config.additional-location
配置时,那么除默认路径也会使用额外路径。额外的路径要优先于默认路径的查找。例如,配置的额外路径是classpath:/custom-config/,file:./custom-config/
,那么查找的路径则依次变成:
file:./custom-config/
classpath:custom-config/
file:./config/
file:./
classpath:/config/
classpath:/
其查找顺序可以在一个配置文件指定默认的值,然后选择性地重写为其他的。也可以提供默认值,通过application.properties
(或者任何其他基础名称的如定义的spring.config.name
)。这些默认值之后就会在运行中被自定义路径中的不同文件覆盖。
如果使用环境变量而不是系统属性,由于大部分操作系统不允许英文句号分隔的键名,所以可以使用下划线代替(例如,
SRPING_CONFIG_NAME
代替spring.config.name
)。
如果应用运行在容器中,那么 JNDI 属性(在
java:comp/env
)或者 servlet 上下文初始化参数会被代替使用,同样地有环境变量,系统属性。
Profile-specific 属性
除了application.properties
文件,profile-specific 属性也可以通过命名格式定义:application-{profile}.properties
。Environment
有一组默认属性集合(默认地,为[default]
)被使用,如果没有指定激活的 profiles。也就是说,如果没有明确地激活 profiles,那么属性就从application-default.properties
加载。
profile-specific 属性会从同一个位置加载为application.properties
,且 profile-specific 文件总会覆盖非 profile-specific 的,无论 profile-specific 文件是在 jar 包之内还是之外。
如果有多个 profiles 被指定,则应用最后者胜出策略。例如,profiles 通过spring.profiles.active
属性指定,那么会在那些通过SpringApplication
API 配置的最后添加,并依此排优先级。
如果在
spring.config.location
指定了任意文件,profiles-specific 形式文件则会被忽略。如果想同时使用 profile-specific 属性,那么就需要在spring.config.location
中指定为目录。
参考
[1] Application Property Files
[2] Profile-specific Properties