一起聊聊 Spring Profiles 的小知識
?大家好,我是指北君。
最近公司新來了一個實習生,挺上進的,天天追著我問問題。指北君開啟了帶實習生打怪升級之路。吶,今天問了一個關于 Spring Profiles 的問題。
實習生:指北君,你知道 Spring Profiles 嗎?
指北君:我知道啊,怎么了?有什么問題嗎?
實習生:那你可以跟我講講嘛,Spring Profiles到底是什么?有什么用?
指北君:好的,Profiles 是 Spring 框架的核心特性,它允許我們在不同的 profiles 條件下,對 Spring bean? 有不同的配置實現(xiàn)。比如說,我們在生產(chǎn)環(huán)節(jié)用 prod 標記,那我們的 spring bean 構造出來之后就使用了 prod 的配置項。所以我們只要在啟動的時候,設定好我們想要的 profile ,那我們就能獲得不同的結果。
實習生:那這個 Spring Profile 在項目里怎么使用的呢?
指北君:好,我找個項目給你看下。
話音剛落,指北君打開了 IDEA,一頓操作,找到了一個配置類。
@Component
@Profile("dev")
public class DevDatasourceConfig
指北君:看到了嗎?我們項目里這個數(shù)據(jù)源配置類上面有個 @Profile? 注解,里面寫了 dev 。就是說這個配置類在 profile=dev 的時候,才能生效。
實習生:那這個挺簡單的呀。
指北君:是的呀,使用起來很簡單的,哦對了,這里有個小技巧。如果我們只是不想在特定環(huán)境下配置某個配置類的話,也有很簡單的操作方式。
@Component
@Profile("!dev")
public class DevDatasourceConfig
你看出區(qū)別了嗎?
實習生:就是 dev 之前加了一個 ?。▏@號)。其他沒有變化。
指北君:是的,就是這樣,這也是一個常用的技巧。
實習生:代碼里雖然這樣配置好了,那項目啟動怎么知道啟用了哪一個配置項呢?
指北君:啟用哪一個配置,這邊有很多種方式可以實現(xiàn)。
1.我們在項目中的 application.properties 文件里直接進行配置即可
spring.profiles.active=dev
2.通過硬編碼實現(xiàn) WebApplicationInitializer 接口,配置 ServletContext 來激活配置
@Configuration
public class MyWebApplicationInitializer
implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter(
"spring.profiles.active", "dev");
}
}
3.直接在 ConfigurableEnvironment 中實現(xiàn)設置,使用 spring boot 的朋友應該都知道,系統(tǒng)所有的配置項都是來自于 ConfigurableEnvironment 。
@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("dev");
4.命令行JVM啟動參數(shù)
-Dspring.profiles.active=dev
5.通過 export 環(huán)境變量來實現(xiàn)
export spring_profiles_active=dev
嗯, 學會了這幾種方法,你已經(jīng)可以在絕大部分場景下,游刃有余地使用 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
就像這樣,直接逗號分割,拼接上去就行了。
實習生:那這樣好像比較麻煩啊,萬一搞漏掉了就給自己挖坑了。
指北君:對的,這就是要仔細了,以前一直要靠自己的?,F(xiàn)在就不會有這個問題了,spring boot 團隊也意識到這個問題了,在 Spring boot 2.4 開始已經(jīng)支持分組了。
spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq
我們平時啟動的時候只要指定 spring.profiles.active=production? 就行了, prodb 和 prodmq 同樣就能成功配置進來。Spring Profiles 的相關內(nèi)容差不多都講完了,你還有什么疑問嗎?
實習生:現(xiàn)在基本沒有了,等我遇到再來找你這大佬。
指北君:隨時歡迎,現(xiàn)在是我在帶你,不要給我丟臉就行。哈哈哈。
總結
本文講述了 Spring Profiles 的配置使用,和如果在啟動的時候,選擇特定的 profile 。也講述了一些使用過程中的一些小技巧,希望對你有幫助。