一文掌握 Spring Boot Profiles

Spring Boot Profiles 簡介

Profile 的概念其實很早在 Spring Framework 就有了,在 Spring Framework 3.1 版本引入了註解 @ProfileEnvironment 環境配置的抽象,只是在 Spring Boot 框架裏再進一步將 Profiles 功能進行擴展,使它也成爲了 Spring Boot 特性之一,爲此單獨在 官方文檔 25. Profiles 一節裏介紹,文檔裏把 Spring Boot Profiles 也叫作 Spring Profiles。html

那麼什麼又是 Spring Profiles,爲何須要它呢?咱們先來看一個熟悉的場景:咱們日常項目開發,常常須要根據不一樣的環境進行配置的修改,好比在本地開發會加載本機的配置和開發環境數據庫,在測試服務器上部署時就須要加載測試環境配置和數據庫,一樣地,當項目發佈生產環境時就須要設置爲生產環境配置和數據庫。這樣一來,不一樣的環境部署都須要額外的處理來調整環境的配置,維護起來十分繁瑣,還容易出錯。git

爲了解決不一樣環境須要的配置切換問題,Spring Profiles 提供了一種方式容許咱們指定在特定環境下只加載對應的程序配置,每一種環境配置對應一個 Profile,只有當前 Profile 處於激活狀態時,纔會將該 Profile 所對應的配置和 Bean 加載到 Spring 程序中。github

Spring Profiles 就是針對應用程序,不一樣環境須要不一樣配置加載的一種解決方案。spring

固然 Spring 容許多個 Profile 處於激活狀態,好比將應用配置進行細分紅數據庫配置,消息中間件配置,緩存配置等,都爲各自在不一樣環境定義不一樣的 Profile 名稱,在須要激活環境對應配置時,指定多個 Profile。數據庫

Spring Profiles 實戰

在 Spring 程序中有兩種方式使用 Profiles:XML 配置和註解 @Profile設計模式

XML 配置定義 Profile

雖然如今 XML 配置方式使用愈來愈少,仍是簡單介紹下,一般咱們在 XML 文件定義的 Bean 時都有根元素 <beans>,在 beans 元素上多了一個屬性 profile 能夠指定環境,好比說把開發環境的 profile 定義爲 dev,生產環境的 profile 爲:prod。緩存

須要注意的是:必需要使用 Spring XML Beans Schema 版本爲 4.0 以上才支持 profile 屬性。在 XML 文件定義以後咱們只須要激活指定的 Profile 名稱就能夠加載對應的 Bean 對象了,在 Spring 程序中激活的方式主要兩種:springboot

  • Java API 方式,獲取當前 Spring 容器的環境 Bean,設置 activeProfiles 屬性,而後啓動容器服務器

  • 採用啓動參數方式指定,固定格式:-Dspring.profiles.active=dev

註解 @Profiles 定義Profile

使用註解定義 Profile 也比較簡單,引入一個新的註解 @Profiles,一般 @Profiles 配合 @Component 或者 @Configuration 使用,以下示例:app

激活 Profile 的方式都是同樣的,只要指定 Profile 被激活,其對應的 Bean 纔會加載。在 Spring 程序中 Profile 默認爲 default,當前咱們能夠經過 spring.profiles.default 配置方式或者 org.springframework.core.env.AbstractEnvironment#setDefaultProfiles API 方式修改。

Spring Boot Profile 實戰

好了,如今咱們再來看下在 Spring Boot 程序中如何使用 Profile。一般一個 Spring Boot 程序的配置文件爲 yml 或者 properties 格式,因爲 yml 格式文件的結構簡潔已讀,備受官方推崇,咱們能夠看下如何在 application.yml 定義 Profile 和對應的配置。

與yml格式文件不一樣,正對不一樣的 Profile,沒法在一個 properties 文件設置,官方採用命名形式爲 applications-${profile}.properties 格式來達成同樣的效果。爲了看到指定 Profile 激活後的效果,咱們能夠經過下方的一個例子實踐下,經過激活不一樣 Profile 啓動程序,來請求 /enviroment 接口來獲取當前的環境配置變量。

這裏咱們介紹如何在配置文件中激活 Profile 的方式:在 application.yml 頂部添加以下配置,代表當前所激活的 Profile 爲 prod,固然也能夠前文介紹的啓動參數方式激活:

而後啓動程序,curl 方式訪問 http://localhost:9000/enviroment 能夠獲得以下輸出結果:

一樣若是上述的 active 屬性值指定爲 dev,將輸出內容: current app enviroment is prod

Spring Boot API 方式激活 Profile

在 Spring Boot 程序除了上述的方法來激活 Profile 外,還可使用 Spring Boot API 方式激活:

  • SpringApplication.setAdditionalProfiles(…)

  • SpringApplicationBuilder.profiles(...)

但須要注意的是使用 Spring Boot API 的話須要在程序啓動前設置,也就是 SpringApplication.run(...) 方法執行前,不然沒有效果。 採用 Spring Boot API 方式添加的Profile 是屬於額外激活的 Profile,也就是說覆蓋掉外部傳入的 spring.profiles.activie 指定的 Profile。

總結

在Spring Boot 程序中,咱們一般定義不一樣 Profiles 的配置文件,如 application-{profile}.properties,在默認配置文件 application.properties 中設置 spring.profiles.active=dev ,用於日常開發使用,當須要打包上傳服務器時,經過啓動參數方式 jar -Dspring.profiles.active=prod xxx.jar 指定對應環境的 Profile 啓動程序來加載對應環境的配置,到這裏咱們學習如何經過 Spring Boot Profiles 特性來應對程序中不一樣環境配置的切換,但願對工做中的小夥伴有所幫助,也歡迎小夥伴留言分享應對項目環境配置區分加載的實踐心得。如有錯誤或者不當之處,還請你們批評指正,一塊兒學習交流。

下篇文章將經過解讀源碼的方式具體講解 Spring Boot Profiles 實現原理,敬請關注期待。

示例代碼

本文示例代碼能夠經過下面倉庫地址獲取:

環境支持:

  • JDK 8
  • SpringBoot 2.1.6
  • Maven 3.6.0

參考資料

推薦閱讀

相關文章
相關標籤/搜索