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