声明
本文翻译自 Spring Boot Reference Guide (docs.spring.io/spring-boot…) ,择其第 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属性指定,那么会在那些通过SpringApplicationAPI 配置的最后添加,并依此排优先级。
如果在
spring.config.location指定了任意文件,profiles-specific 形式文件则会被忽略。如果想同时使用 profile-specific 属性,那么就需要在spring.config.location中指定为目录。
参考
[1] Application Property Files
[2] Profile-specific Properties