1. 程式人生 > >SpringBoot | 第三章:SpringBoot 配置詳解

SpringBoot | 第三章:SpringBoot 配置詳解

基於SpringBoot的約定優於配置的原則,在多數情況下,啟動一個應用時,基本上無需做太多的配置,應用就能正常啟動。但在大部分開發環境下,新增額外配置是無所避免的,比如自定義應用埠號(比較在機器比較少的情況下,一臺機器還是需要部署多個應用的,當然利用docker的話,是可避免的,這是後話了)、mq的服務地址、快取服務的服務地址、資料庫的配置等,都或多或少的需要一些外部的配置項。

SpringBoot預設的全域性配置檔名為application.properties或者application.yml(spring官方推薦使用的格式是.yml格式,目前官網都是例項都是使用yml格式進行配置講解的),應用啟動時會自動載入此檔案,無需手動引入。除此之外還有一個bootstrap

的全域性檔案,它的載入順序在application配置檔案之前,主要是用於在應用程式上下文的引導階段,在後期講解springCloudConfig時,主要是利用此特性,進行配置檔案的動態修改,在此不表,在通常情況下,此兩個配置檔案是沒有差別的,所以一般上都只需要配置application即可。

application.properties配置檔案支援自定義屬性的支援,比如

然後可通過@Value("${blog.author}")的形式獲取屬性值。

這裡提醒下,在填寫一些預設的比如,資料庫屬性時,可使用alt+/的方式,IDE會自動顯示提示,避免了手動嵌入屬性值或者忘記屬性的尷尬。

關於自定義屬性時,特別是一些公用包,會使用到屬性值時,建議在建立additional-spring-configuration-metadata.json屬性元檔案,這樣在使用上述快捷方式時,會進行提示,包括屬性名和屬性說明,這樣也方便呼叫者詢問屬性名是啥。

在配置檔案中,各個屬性引數可進行引用的,比如:

最後blog.desc的值即可:oKong,https://blog.lqdev.cn。利用此特性,並可實現一些特殊的功能。比如後期講解spring cloud時,註冊eurka註冊中心的例項名時,並會使用類似如下配置,使得例項名一眼就知道哪臺服務地址:

這裡需要注意,由於springboot

在讀取properties檔案時,使用的是PropertiesPropertySourceLoader類進行讀取,預設讀取的編碼是ISO 8859-1,故在預設的配置檔案中使用中文時,會出現亂碼,此時可以將中文轉成Unicode編碼或者使用yml配置格式(預設就支援utf-8),再不濟可以將作為配置寫入到一個自定義配置檔案,利用@PropertySource註解的encoding屬性指定編碼

Spring Boot的屬性配置檔案中可以通過${random}來產生int值、long值或者string字串,來支援屬性的隨機值。

在多數情況下,配置資訊基本上都是放入application.properties檔案中,但在一些場景下,比如某個配置項比較多時,為了分開存放,也可自定義配置檔案,如my.properties。由於自定義的檔案,系統不會自動載入,這個時候就需要手動引入了。
利用@PropertySource註解既可以引入配置檔案,需要引入多個時,可使用@PropertySources設定陣列,引入多個檔案。

雖然使用@Value()方式,能方便的引入自定義的屬性值,但在多某個配置項屬於某一配置時,希望對應到一個實體配置類中,SpringBoot也提供了支援。利用@ConfigurationProperties屬性,即可完成
my.properties配置檔案:

實體類:

這裡可直接加入@Component使其在啟動時被自動掃描到,或者使用@EnableConfigurationProperties註解註冊此實體bean.
其次,在引入@ConfigurationProperties時,IDE會提示你引入spring-boot-configuration-processor依賴,前面提到,在自定義屬性時,建立additional-spring-configuration-metadata.json可進行屬性提示,而此依賴功能類似,會編譯時自動生成spring-configuration-metadata.json檔案,此檔案主要給IDE使用,用於提示使用。新增後在配置檔案點選屬性時,會自動跳轉到對應繫結的實體類中

配置了以下配置,然後利用List<String>就能獲取hobby的值了。

總結

目前網際網路上很多大佬都有springboot系列教程,如有雷同,請多多包涵了。本文是作者在電腦前一字一句敲的,每一步都是親身實際過的。若文中有所錯誤之處,還望提出,謝謝。

老生常談

  • 個人QQ:499452441
  • 微信公眾號:lqdevOps
    公眾號公眾號