在應用中管理配置並非一個容易的任務,尤爲是在應用須要部署到多個環境中時。一般會須要爲每一個環境提供一個對應的屬性文件,用來配置各自的數據庫鏈接信息、服務器信息和第三方服務帳號等。一般的應用部署會包含開發、測試和生產等若干個環境。不一樣的環境之間的配置存在覆蓋關係。測試環境中的配置會覆蓋開發環境,而生產環境中的配置會覆蓋測試環境。Spring 框架自己提供了多種的方式來管理配置屬性文件。Spring 3.1 以前可使用 PropertyPlaceholderConfigurer。Spring 3.1 引入了新的環境(Environment)和概要信息(Profile)API,是一種更加靈活的處理不一樣環境和配置文件的方式。不過 Spring 這些配置管理方式的問題在於選擇太多,讓開發人員無所適從。Spring Boot 提供了一種統一的方式來管理應用的配置,容許開發人員使用屬性文件、YAML 文件、環境變量和命令行參數來定義優先級不一樣的配置值。
<!-- more -->html
Spring Boot 可使用外部化配置來方便在不一樣環境的運行一樣的程序java
Spring Boot 實現了不少PropertySource
,按如下順序,進行合理的相同屬性的覆蓋:git
System.getProperties()
).application-{profile}.properties
和YAML變量).application-{profile}.properties
and YAML 變量).application.properties
and YAML 變量).application.properties
and YAML 變量).@Configuration
類上@PropertySource
註解.Note:github
Relaxed Binding(寬鬆綁定規則)spring
Property | Note |
---|---|
acme.my-project.person.first-name |
建議在 .properties and .yml 文件中使用. |
acme.myProject.person.firstName |
標準的駝峯命名 |
acme.my_project.person.first_name |
下劃線命名, .properties and .yml 文件中使用. |
ACME_MYPROJECT_PERSON_FIRSTNAME |
大寫下劃線命名, 在環境變量中使用. |
注意:數據庫
- 在儘量的狀況下,請使用小寫的短橫線命名的方法會,好比:
my.property-name=acme
- 在註解@ConfigurationProperties中定義或者在@ConditionalOnProperty的時候屬性名前綴的時候必須使用短橫分隔命名,而且必須小寫,只有註解中命名的時候必須遵照這個命名規則。我發現有些文章描述這個變化是不許確的,並非全部狀況下都是須要這樣,好比我能夠在配置文件中使用上述表格中的命名方式。
RelaxedPropertyResolver
類解析工具被刪除掉,由Environment
類代替RelaxedDataBinder
類綁定工具類被刪除掉,在2.0.0以後使用Binder
類,以下使用方式api
MyProperties target = Binder.get(environment) .bind("app.acme", MyProperties.class) .orElse(null); FlagType flagType = Binder.get(environment) .bind("acme.app.my-flag", FlagType.class) .orElse(FlagType.DEFAULT);
若是在2.0以後的版本須要在@ConfigurationProperties
配置的類中使用驗證必須使用@Validated
註解服務器
spring.config.location
屬性在2.0以前的版本中會默認增長一個新的文件目錄或者文件,在2.0的版本中,若是還要使用以前的功能,請使用spring.config.additional-locationapp