大家好,我是指北君。
最近公司新來了一個實習生,挺上進的,天天追著我問問題。指北君開啟了帶實習生打怪升級之路。吶,今天問了一個關於 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技術指北】,第一時間獲取更多精彩內容。