天天看點

Spring Boot 2.0 新特性(一):配置綁定 2.0 全解析

在Spring Boot 2.0中推出了Relaxed Binding 2.0,對原有的屬性綁定功能做了非常多的改進以幫助我們更容易的在Spring應用中加載和讀取配置資訊。下面本文就來說說Spring Boot 2.0中對配置的改進。

在Spring Boot 2.0中對配置屬性加載的時候會除了像1.x版本時候那樣移除特殊字元外,還會将配置均以全小寫的方式進行比對和加載。是以,下面的4種配置方式都是等價的:

properties格式:

yaml格式:

Tips:推薦使用全小寫配合<code>-</code>分隔符的方式來配置,比如:<code>spring.jpa.database-platform=mysql</code>

在properties檔案中使用<code>[]</code>來定位清單類型,比如:

也支援使用逗号分割的配置方式,上面與下面的配置是等價的:

而在yaml檔案中使用可以使用如下配置:

也支援逗号分割的方式:

注意:在Spring Boot 2.0中對于List類型的配置必須是連續的,不然會抛出<code>UnboundConfigurationPropertiesException</code>異常,是以如下配置是不允許的:

在Spring Boot 1.x中上述配置是可以的,<code>foo[1]</code>由于沒有配置,它的值會是<code>null</code>

Map類型在properties和yaml中的标準配置方式如下:

注意:如果Map類型的key包含非字母數字和<code>-</code>的字元,需要用<code>[]</code>括起來,比如:

簡單類型

在環境變量中通過小寫轉換與<code>.</code>替換<code>_</code>來映射配置檔案中的内容,比如:環境變量<code>SPRING_JPA_DATABASEPLATFORM=mysql</code>的配置會産生與在配置檔案中設定<code>spring.jpa.databaseplatform=mysql</code>一樣的效果。

List類型

由于環境變量中無法使用<code>[</code>和<code>]</code>符号,是以使用<code>_</code>來替代。任何由下劃線包圍的數字都會被認為是<code>[]</code>的數組形式。比如:

另外,最後環境變量最後是以數字和下劃線結尾的話,最後的下劃線可以省略,比如上面例子中的第一條和第三條等價于下面的配置:

系統屬性與檔案配置中的類似,都以移除特殊字元并轉化小寫後實作綁定,比如下面的指令行參數都會實作配置<code>spring.jpa.databaseplatform=mysql</code>的效果:

系統屬性的綁定也與檔案屬性的綁定類似,通過<code>[]</code>來标示,比如:

同樣的,他也支援逗号分割的方式,比如:

上文介紹了Spring Boot 2.0中對屬性綁定的内容,可以看到對于一個屬性我們可以有多種不同的表達,但是如果我們要在Spring應用程式的environment中讀取屬性的時候,每個屬性的唯一名稱符合如下規則:

通過<code>.</code>分離各個元素

最後一個<code>.</code>将字首與屬性名稱分開

必須是字母(a-z)和數字(0-9)

必須是小寫字母

用連字元<code>-</code>來分隔單詞

唯一允許的其他字元是<code>[</code>和<code>]</code>,用于List的索引

不能以數字開頭

是以,如果我們要讀取配置檔案中<code>spring.jpa.database-platform</code>的配置,可以這樣寫:

而下面的方式是無法擷取到<code>spring.jpa.database-platform</code>配置内容的:

注意:使用<code>@Value</code>擷取配置内容的時候也需要這樣的特點

在Spring Boot 2.0中增加了新的綁定API來幫助我們更容易的擷取配置資訊。下面舉個例子來幫助大家更容易的了解:

例子一:簡單類型

假設在propertes配置中有這樣一個配置:<code>com.didispace.foo=bar</code>

我們為它建立對應的配置類:

接下來,通過最新的<code>Binder</code>就可以這樣來拿配置資訊了:

例子二:List類型

如果配置内容是List類型呢?比如:

要擷取這些配置依然很簡單,可以這樣實作:

本文的相關例子可以檢視下面倉庫中的<code>Chapter2-2-1</code>目錄:

<a href="https://github.com/dyc87112/SpringBoot-Learning">Github:https://github.com/dyc87112/SpringBoot-Learning</a>

<a href="https://gitee.com/didispace/SpringBoot-Learning">Gitee:https://gitee.com/didispace/SpringBoot-Learning</a>