首頁>技術>

下一篇[未完待續]

英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-configGitHub:https://github.com/jijicai/Spring/tree/master/spring-boot

24.7、使用 YAML 代替 Properties

YAML 是 JSON 的超集,因此,它是一種用於指定分層配置資料的便捷格式。只要類路徑上有 Snake YAML 庫,SpringApplication 類就會自動支援 YAML 作為 properties 的替代者。

註釋:如果你使用“Starters”,Snake YAML 將由 spring.boot.starter 自動提供。

24.7.1、載入 YAML

Spring Framework 提供了兩個方便的類,可用於載入 YAML 文件。YamlPropertiesFactoryBean 將 YAML 載入為 Properties,YamlMapFactoryBean 將 YAML 載入為 Map。

例如,考慮下面的 YAML 文件:

environments:    dev:        url: https://dev.example.com        name: Developer Setup    prod:        url: https://another.example.com        name: My Cool App

前面的示例將轉換為以下屬性:

environments.dev.url=https://dev.example.comenvironments.dev.name=Developer Setupenvironments.prod.url=https://another.example.comenvironments.prod.name=My Cool App

YAML 列表用帶有 [index] 取消引用(dereferencers)的屬性鍵表示。例如,考慮以下 YAML:

my:servers:    - dev.example.com    - another.example.com

前面的示例將轉換為這些屬性:

my.servers[0]=dev.example.commy.servers[1]=another.example.com

要通過使用 Spring Boot 的 Binder 工具類(這就是 @ConfigurationProperties 所做的)繫結到類似的屬性,需要在目標 bean 中有一個 java.util.List(或 Set) 型別的屬性,並且需要提供 setter 或使用可變值初始化它。例如,下面的示例繫結到前面顯示的屬性:

@ConfigurationProperties(prefix="my")public class Config {    private List<String> servers = new ArrayList<String>();    public List<String> getServers() {        return this.servers;    }}

24.7.2、在 Spring 環境中將 YAML 作為屬性公開

YamlPropertySourceLoader 類可用於在 Spring Environment 中將 YAML 公開為 PropertySource。這樣就可以使用帶有佔位符語法的 @Value 註解來訪問 YAML 屬性。

24.7.3、多配置的 YAML 文件

通過使用 spring.profiles 鍵指示文件何時應用,可以在單個檔案中指定多個特定配置的 YAML 文件,如下面示例所示:

server:    address: 192.168.1.100---spring:    profiles: developmentserver:    address: 127.0.0.1---spring:    profiles: production & eu-centralserver:    address: 192.168.1.120

在上面的例子中,如果啟用 development 配置,則 server.address 屬性是 127.0.0.1。類似地,如果啟用 production 和 eu-central 配置,則 server.address 屬性是 192.168.1.120。如果未啟用 development、production 和 eu-central 配置,那麼該屬性值是 192.168.1.100。

註釋:因此,spring.profiles 可以包含一個簡單的配置檔名(例如:production)或配置檔案表示式。profile 表示式允許表達更復雜的 profile 邏輯,例如:production & (eu-central|eu-west)。請檢視參考指南了解更多詳細資訊。(https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/core.html#beans-definition-profiles-java )

如果應用程式上下文啟動時沒有顯示啟用配置檔案,則將啟用預設的。因此,在下面的 YAML 中,我們為 spring.security.user.password 設定一個值,它僅在“預設”配置檔案中可用:

server:  port: 8000---spring:  profiles: default  security:    user:      password: weak

但是,在下面的示例中,始終設定密碼,因為它沒有附加到任何配置檔案,並且必須在所有其他配置檔案中根據需要顯式重置密碼:

server:  port: 8000spring:  security:    user:      password: weak

通過使用 spring.profiles 元素指定的 Spring 配置檔案可以通過使用“!”字元取反。如果為單個文件同時指定了否定配置檔案和非否定配置檔案,則必須至少有一個非否定配置檔案匹配,並且不能有否定配置檔案匹配。

24.7.4、YAML 的缺點

無法使用 @PropertySource 註解載入 YAML 檔案。因此,如果需要以這種方式載入值,則需要使用屬性檔案。

在特定配置的 YAML 檔案中使用多個 YAML 文件語法可能會導致意外行為。例如,在名為 application-dev.yml 的檔案中考慮以下配置,其中 dev 配置檔案處於活動狀態:

server:  port: 8000---spring:  profiles: !test  security:    user:      password: weak

在上面的例子中,profile 否定和 profile 表示式的行為將不符合預期。我們建議你不要將特定配置的 YAML 檔案和多個 YAML 文件組合在一起,而只使用其中的一個。

下一篇[未完待續]

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 虛擬桌面測試:Optane DIMM持久記憶體能否降低VDI成本?