Spring Boot 2.0 外部化配置介紹

簡介

在應用中管理配置並非一個容易的任務,尤爲是在應用須要部署到多個環境中時。一般會須要爲每一個環境提供一個對應的屬性文件,用來配置各自的數據庫鏈接信息、服務器信息和第三方服務帳號等。一般的應用部署會包含開發、測試和生產等若干個環境。不一樣的環境之間的配置存在覆蓋關係。測試環境中的配置會覆蓋開發環境,而生產環境中的配置會覆蓋測試環境。Spring 框架自己提供了多種的方式來管理配置屬性文件。Spring 3.1 以前可使用 PropertyPlaceholderConfigurer。Spring 3.1 引入了新的環境(Environment)和概要信息(Profile)API,是一種更加靈活的處理不一樣環境和配置文件的方式。不過 Spring 這些配置管理方式的問題在於選擇太多,讓開發人員無所適從。Spring Boot 提供了一種統一的方式來管理應用的配置,容許開發人員使用屬性文件、YAML 文件、環境變量和命令行參數來定義優先級不一樣的配置值。

<!-- more -->html

Spring Boot 可使用外部化配置來方便在不一樣環境的運行一樣的程序java

  • properties 文件
  • YAML 文件
  • 環境變量
  • 命令行參數

內置順序

Spring Boot 實現了不少PropertySource,按如下順序,進行合理的相同屬性的覆蓋:git

  1. home目錄下的devtools全局設置屬性(~/.spring-boot-devtools.properties,若是devtools激活)
  2. 測試用例上的@TestPropertySource註解.
  3. 測試用例上的@SpringBootTest#properties註解。
  4. 命令行參數
  5. 來自SPRING_APPLICATION_JSON的屬性(環境變量或系統屬性中內嵌的內聯JSON)
  6. ServletConfig初始化參數.
  7. ServletContext初始化參數.
  8. 來自於java:comp/env的JNDI屬性.
  9. Java系統屬性 (System.getProperties()).
  10. 操做系統環境變量.
  11. RandomValuePropertySource,只包含random.*中的屬性.
  12. jar包或者war包以外Profile-specific應用屬性(application-{profile}.properties和YAML變量).
  13. Jar包內的的Profile-specific應用屬性 (application-{profile}.properties and YAML 變量).
  14. Application properties outside of your packaged jar (application.properties and YAML 變量).
  15. Application properties packaged inside your jar (application.properties and YAML 變量).
  16. 配置在@Configuration 類上@PropertySource 註解.
  17. SpringApplication.setDefaultProperties 指定的默認屬性

Note:github

  • 以上是Spring-Boot內部的默認順序,並非絕對順序,實際擴展的時候須要注意順序問題,後續我會在實踐篇去說明這個。

Spring Boot 1.5 vs 2.0 變化

  1. 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);
    1. 在2.0以前的版本可使用get/set方式注入靜態變量,2.0之後再也不支持
    2. @ConfigurationProperties Validation

      若是在2.0以後的版本須要在@ConfigurationProperties配置的類中使用驗證必須使用@Validated註解服務器

    3. Configuration Location

      spring.config.location 屬性在2.0以前的版本中會默認增長一個新的文件目錄或者文件,在2.0的版本中,若是還要使用以前的功能,請使用spring.config.additional-locationapp

    參考

    1. Spring Boot Reference Guide-2.0.3
    2. Spring Boot Reference Guide-1.5.8
    3. Spring Boot 2.0 Configuration Changelog
    4. Relaxed Binding 2.0
    相關文章
    相關標籤/搜索