1. 程式人生 > >自學SpringBoot三之多環境配置——Profile

自學SpringBoot三之多環境配置——Profile

在真實的工作專案中,都是採用多環境的形式,程式碼相同但各自分離且互不相擾。例如開發人員使用的是開發環境,測試人員使用的是測試環境,而專案上線之後使用的則是生產環境。這個三個階段,都有各自的配置檔案,如果只是一個配置檔案來回改會很容易出現錯誤和疏漏的。由於在專案中使用Maven打包部署的時候,經常由於配置引數過多(比如Nginx伺服器的資訊、ZooKeeper的資訊、資料庫連線、Redis伺服器地址等),導致實際生產的配置引數與測試伺服器引數混淆,一旦在部署的時候某個引數忘記修改了,那麼就必須重新打包部署,這確實讓人感到非常頭疼,因此springboot提供了很簡單的解決辦法——Profile。

一、什麼是Profile

Profile是Spring對不同環境提供不同配置功能的支援,可以通過啟用,指定引數等方式快速切換環境。

Spring中的Profile功能其實早在Spring 3.1的版本就已經出來,它可以理解為我們在Spring容器中所定義的Bean的邏輯組名稱,只有當這些Profile被啟用的時候,才會將Profile中所對應的Bean註冊到Spring容器中。舉個更具體的例子,我們以前所定義的Bean,當Spring容器一啟動的時候,就會一股腦的全部載入這些資訊完成對Bean的建立;而使用了Profile之後,它會將Bean的定義進行更細粒度的劃分,將這些定義的Bean劃分為幾個不同的組,當Spring容器載入配置資訊的時候,首先查詢啟用的Profile,然後只會去載入被啟用的組中所定義的Bean資訊,而不被啟用的Profile中所定義的Bean定義資訊是不會載入用於建立Bean的

二、如何使用Profile

簡單的說,就是將原來三個環境都配置在同一個配置檔案中,而使用了Profile之後,則變成了將三個環境的配置分別配置在三個不同的配置檔案中,當實際執行的時候,九可以通過某個啟用某個引數來使用某個環境的配置。此時spring容器只會載入被啟用的那個配置,沒被啟用的則不會載入。這就從原來每次都需要更改一大篇的配置資訊變成了如今只需更改一個引數就能達到目的了,大大的提升了開發的效率以及降低了出錯率。

三、使用Profile的幾種方式

1.多Profile檔案

我們在主配置檔案編寫的時候,檔名可以寫為application-{profile}.properties

或者application-{profile}.yml

此處的profile表示的是一個需要傳入的引數,引數是什麼,spring容器就載入對應的配置檔案。

專案目錄結構:

application.properties(主配置),application-dev.properties(開發環境),application-product.properties(生產環境),

application-test.properties(測試環境),結構如下圖所示。

一般情況下,若沒有啟用spring.profiles.active,spring預設只加載主配置檔案,但只要在主配置檔案中加入了這個引數,且為它賦予了對應的值,則spring會載入對應環境的配置檔案。

話不多說看程式碼:

application.properties檔案——這是沒有啟用spring.profiles.active

server.port=8080

啟動專案之後的結果,可以看到啟動的埠號是8080;

application.properties檔案——這是激活了spring.profiles.active

server.port=8080
#值為dev,product,test則代表了不同的執行環境
spring.profiles.active=dev

啟動專案之後的結果,可以看到啟動的埠號正是我們在application-dev.properties檔案配置的埠號,其他的以此類推。

application-dev.properties檔案

server.port=8081

application-product.properties檔案

server.port=8082

application-test.properties檔案

server.port=8083

2.yml支援多文件塊,更簡潔的一種方式

在yml格式的檔案中可以用三個短橫線加換行(---)來區分不同的配置模組。當然要將之前的properties之中的配置註釋掉,避免衝突。

application.yml檔案,注意那三個短橫線,將一個yml檔案分割成了不同的模組

#主配置環境
server:
  port: 8080
#啟用使用哪個環境,不啟用則預設使用主配置環境
spring:
  profiles:
    active: dev

---
#dev環境
server:
  port: 8011
#定義屬於具體的哪一個環境
spring:
  profiles: dev

---
#product環境
server:
  port: 8012
#定義屬於具體的哪一個環境
spring:
  profiles: product

---
#test環境
server:
  port: 8013
#定義屬於具體的哪一個環境
spring:
  profiles: test

啟動專案的結果,正和我們所配置的一樣

3.使用命令列引數啟用指定的profile

使用命令列引數進行指定的優先順序最高。此時即便我在主配置檔案中啟用的是dev環境,但只要我們的命令列引數的配置是其他的引數,則以命令列的引數配置為準。

看圖:配置命令列引數——在Program arguments欄目中填上:--spring.profiles.active=test

則執行的將會是測試環境!

結果:

4.使用虛擬機器引數

在VM options:-Dspring.profiles.active=product;命令列引數的配置優先順序高於虛擬機器引數