24.3 Application property files

SpringApplication将从以下位置加载application.properties文件,并把它们添加到Spring Environment中:

  1. 当前目录下的/config子目录。
  2. 当前目录。
  3. classpath下的/config包。
  4. classpath根路径(root)。

该列表是按优先级排序的(列表中排名靠前的的路径下定义的属性将覆盖排名靠后的的)

你可以使用YAML('.yml')文件替代'.properties'

如果不喜欢将application.properties作为配置文件名,你可以通过指定spring.config.name环境属性来切换其他的名称,也可以使用spring.config.location环境属性引用一个明确的路径(不同目录位置或文件路径列表之间以逗号分割)。

# 修改配置文件的名称,默认为application
$ 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决定加载哪个文件,所以它们必须定义为environment属性(通常为OS env,系统属性(指的是JVM)或命令行参数(运行jar时传入的参数agrs))。

如果spring.config.location包含目录(相对于文件),那它们应该以/结尾(在被加载前,spring.config.name关联的名称(包括profile-specific的文件名)都将被追加到后面)。

但如果spring.config.location下定义的是文件,那么就不支持profile-specific变体,而是直接按定义的确切文件来查找属性,并且后定义的文件中的属性覆盖之前定义的文件中的属性。 举例:

我们在classpath下建立了 appconfig.properties, appconfig-dev.properties, myconfig/appconfig.properties, myconfig/appconfig-dev.properties,然后设置参数 --spring.config.location=classpath:/appconfig.properties,classpath:/myconfig/appconfig.properties --spring.profiles.active=dev 会发现最后使用的属性是/myconfig/appconfig.properties下的属性,而不是myconfig/appconfig-dev.properties下的属性

但如果我们设置的参数是--spring.config.name=appconfig --spring.config.location=classpath:/,classpath:/myconfig/ --spring.profiles.active=dev 那么最后使用的参数是/myconfig/appconfig-dev.properties下的属性

不管spring.config.location配置什么值,默认总会按照classpath:, classpath:/config, file:, file:config/的顺序进行搜索,优先级由低到高,也就是file:config/获胜。如果你指定自己的位置,它们会优先于所有的默认位置(locations),并使用相同的由低到高的优先级顺序。那样,你就可以在application.properties为应用设置默认值,然后在运行的时候使用不同的文件覆盖它,同时保留默认配置。

如果使用环境变量(操作系统)而不是系统属性,需要注意多数操作系统的key名称不允许以句号(.)分割(period-separated),但你可以使用下划线(underscores)代替(比如,使用SPRING_CONFIG_NAME代替spring.config.name)。

如果应用运行在容器中,那么JNDI属性(java:comp/env)或servlet上下文初始化参数可以用来代替环境变量或系统属性,当然也可以使用环境变量或系统属性。

results matching ""

    No results matching ""