帶實習生學Spring Boot 之 Spring Profiles

No.304發表於2021-07-16

大家好,我是指北君。

最近公司新來了一個實習生,挺上進的,天天追著我問問題。指北君開啟了帶實習生打怪升級之路。吶,今天問了一個關於 Spring Profiles 的問題。

實習生:指北君,你知道 Spring Profiles 嗎?

指北君:我知道啊,怎麼了?有什麼問題嗎?

實習生:那你可以跟我講講嘛,Spring Profiles到底是什麼?有什麼用?

指北君:好的,Profiles 是 Spring 框架的核心特性,它允許我們在不同的 profiles 條件下,對 Spring bean 有不同的配置實現。 比如說,我們在生產環節用 prod 標記,那我們的 spring bean 構造出來之後就使用了 prod 的配置項。所以我們只要在啟動的時候,設定好我們想要的 profile ,那我們就能獲得不同的結果。

實習生:那這個 Spring Profile 在專案裡怎麼使用的呢?

指北君:好,我找個專案給你看下。

話音剛落,指北君開啟了 IDEA,一頓操作,找到了一個配置類。

@Component
@Profile("dev")
public class DevDatasourceConfig 

指北君:看到了嗎? 我們專案裡這個資料來源配置類上面有個 @Profile 註解,裡面寫了 dev 。就是說這個配置類在 profile=dev 的時候,才能生效。

實習生:那這個挺簡單的呀。

指北君:是的呀,使用起來很簡單的,哦對了,這裡有個小技巧。如果我們只是不想在特定環境下配置某個配置類的話,也有很簡單的操作方式。

@Component
@Profile("!dev")
public class DevDatasourceConfig 

你看出區別了嗎?

實習生:就是 dev 之前加了一個 !(歎號)。其他沒有變化。

指北君:是的,就是這樣,這也是一個常用的技巧。

實習生:程式碼裡雖然這樣配置好了,那專案啟動怎麼知道啟用了哪一個配置項呢?

指北君:啟用哪一個配置,這邊有很多種方式可以實現。
1、我們在專案中的 application.properties 檔案裡直接進行配置即可

spring.profiles.active=dev

2、通過硬編碼實現 WebApplicationInitializer 介面,配置 ServletContext 來啟用配置

@Configuration
public class MyWebApplicationInitializer 
  implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
 
        servletContext.setInitParameter(
          "spring.profiles.active", "dev");
    }
}

3、直接在 ConfigurableEnvironment 中實現設定,使用 spring boot 的朋友應該都知道,系統所有的配置項都是來自於 ConfigurableEnvironment 。

@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("dev");

4、命令列JVM啟動引數

-Dspring.profiles.active=dev

5、通過 export 環境變數來實現

export spring_profiles_active=dev

嗯, 學會了這幾種方法,你已經可以在絕大部分場景下,遊刃有餘地使用 profile 了。

實習生:那我還有個問題,既然這樣配置的話,那我專案裡有多個profile, 萬一我手抖,沒有用你說的這幾種配置好呢? 那會怎麼樣?

指北君:這個你放心,spring boot 有兜底方法,你想啊,你在一些專案沒有用到 profile 的時候,spring boot 是怎麼啟動的呢?spring boot 專案會自動使用預設配置

spring.profiles.default=none

也就是說,spring boot 啟動了,但是沒有載入任何被@Profile 等標記的配置類。只會載入沒有被標記的配置類。

實習生:懂了,我看我們專案裡,有很多類似 @Profile("db") @Profile("mysql") 之類的,那像這種多個的怎麼使用的?

指北君:是的,我們專案中,不同的模組都分開配置了, 我給你舉個例子怎麼使用的。

-Dspring.profiles.active=dev,db,mysql

就像這樣,直接逗號分割,拼接上去就行了。

實習生:那這樣好像比較麻煩啊,萬一搞漏掉了就給自己挖坑了。

指北君:對的,這就是要仔細了,以前一直要靠自己的。現在就不會有這個問題了,spring boot 團隊也意識到這個問題了,在 Spring boot 2.4 開始已經支援分組了。

spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq

我們平時啟動的時候只要指定 spring.profiles.active=production 就行了, prodb 和 prodmq 同樣就能成功配置進來。 Spring Profiles 的相關內容差不多都講完了,你還有什麼疑問嗎?

實習生:現在基本沒有了,等我遇到再來找你這大佬。

指北君:隨時歡迎,現在是我在帶你,不要給我丟臉就行。哈哈哈。

總結

本文講述了 Spring Profiles 的配置使用,和如果在啟動的時候,選擇特定的 profile 。也講述了一些使用過程中的一些小技巧,希望對你有幫助。

有任何問題可以在公眾號後臺留言,指北君會第一時間回覆大家。歡迎關注公眾號【Java技術指北】,第一時間獲取更多精彩內容。

相關文章