Profile 的概念其實很早在 Spring Framework 就有了,在 Spring Framework 3.1 版本引入了註解 @Profile
和 Environment
環境配置的抽象,只是在 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: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
使用註解定義 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 程序的配置文件爲 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 程序除了上述的方法來激活 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 實現原理,敬請關注期待。
本文示例代碼能夠經過下面倉庫地址獲取:
環境支持: