3. 多環境選擇
3.1 什麼是多環境選擇
以下兩種場景下需要進行“多環境選擇”。
(1) 相同代碼運作在不同環境
在開發應用時,通常同一套程式會被運作在多個不同的環境,例如,開發、測試、生産環境等。每個環境的資料庫位址、伺服器端口号等配置都會不同。若在不同環境下運作時将配置檔案修改為不同内容,那麼,這種做法不僅非常繁瑣,而且很容易發生錯誤。
此時就需要定義出不同的配置資訊,在不同的環境中自動選擇不同的配置。
(2) 不同環境執行不同實作類
在開發應用時,有時不同的環境,需要運作的接口的實作類也是不同的。例如,若要開發一個具有短信發送功能的應用,開發環境中要執行的 send()方法僅需調用短信模拟器即可,而生産環境中要執行的 send()則需要調用短信營運商所提供的短信發送接口。
此時就需要開發兩個相關接口的實作類去實作 send()方法,然後在不同的環境中自動選擇不同的實作類去執行。
3.2 需求
下面将實作如下功能:存在開發與生産兩種環境,不同環境使用不同配置檔案,不同環境調用不同接口實作類。
3.3 多配置檔案實作方式
(1) 定義工程
複制Spring Boot 快速入門中的工程,并重命名為 03-multiEnv。
(2) 定義配置檔案
-
A、定義多個配置檔案
在 src/main/resources 中再定義兩個配置檔案,分别對應開發環境與生産環境。
-
B、 說明
在 Spring Boot 中多環境配置檔案名需要滿足
的格式,其中{profile}為對應的環境辨別,例如,application-{profile}.properties
- application-dev.properties:開發環境
- application-test.properties:測試環境
- application-prod.properties:生産環境
至于哪個配置檔案會被加載,則需要在 application.properties 檔案中通過spring.profiles.active 屬性來設定,其值對應{profile}值。例如,spring.profiles.active=test 就會加載 application-test.properties 配置檔案内容。
在生産環境下,application.properties 中一般配置通用内容,并設定 spring.profiles.active 屬性的值為 dev,即,直接指定要使用的配置檔案為開發時的配置檔案,而對于其它環境的選擇,一般是通過指令行方式去激活。配置檔案 application-{profile}.properties 中則配置各個環境的不同内容。
(3) 定義業務代碼
- A、定義業務接口
- B、 定義兩個實作類
- C、 說明
在實作類上添加@Profile 注解,并在注解參數中指定前述配置檔案中的{profile}值,用于指定該實作類所适用的環境。
(4) 定義處理器
(5) Idea 下運作與通路
-
A、運作
打開主類在 Idea 中直接運作,即可在控制台看到預設使用的是開發環境,即端口号使用的是 8888,而工程的根路徑為/ddd。
- B、 通路 從頁面顯示内容可知,其執行的業務接口實作類為 DevelopServiceImpl,即開發階段應使用的實作類。
- C、 修改配置檔案
-
D、再運作
将上次運作停掉後再次運作主類,即可在控制台看到使用的是生産環境,即端口号使用的是 9999,而工程的根路徑為/ppp。
- E、 再通路 從頁面顯示内容可知,此次執行的業務接口實作類為 ProduceServiceImpl,即生産環境下應使用的實作類。
(6) 在指令行下選擇環境
将工程打為 Jar 包後,在指令行運作。若要想切換運作環境,必須要修改主配置檔案嗎?答案是否定的。隻需添加一個指令參數即可動态指定。
-
A、在指令行下運作 Jar 包
例如,現在的主配置檔案中指定的是 dev 環境。
将目前工程打為 Jar 包後,在指令行運作時添加如下參數。 此時執行的就是生産環境,調用的就是 ProduceServiceImpl 類。 - B、 說明
在指令行中添加的參數可以是寫在配置檔案中的任意屬性。其原理是指令行設定的屬性值的優選級高于配置檔案的。
3.4 單配置檔案實作方式
這種實作方式隻能使用 application.yml 檔案,使用 application.properties 檔案好像檔案本身就會出錯。
(1) 定義工程
複制前面的 3-multiEnv 工程,并重命名為 03-multiEnv2。
(2) 修改配置檔案
将原有的配置檔案全部删除,然後定義 application.yml 檔案。需要注意的是,這三部分之間是由三個減号(-)分隔的,必須是三個。而這三部分充當着之前的三個配置檔案。
(3) 運作與通路
運作與通路方式與前面的多配置檔案的完全相同。