Spring Boot -- 配置切換指南

一般在一個(gè)項(xiàng)目中,總是會(huì)有好多個(gè)環(huán)境球散。比如:

開發(fā)環(huán)境 -> 測(cè)試環(huán)境 -> 預(yù)發(fā)布環(huán)境 -> 生產(chǎn)環(huán)境

每個(gè)環(huán)境上的配置文件總是不一樣的,甚至開發(fā)環(huán)境中每個(gè)開發(fā)者的環(huán)境可能也會(huì)有一點(diǎn)不同,配置讀取可是一個(gè)讓人有點(diǎn)傷腦筋的問題漫蛔。

Spring Boot提供了一種優(yōu)先級(jí)配置讀取的機(jī)制來幫助我們從這種困境中走出來嗜愈。

常規(guī)情況下,我們都知道Spring Boot的配置會(huì)從application.properties中讀取莽龟。實(shí)際上蠕嫁,從resource目錄下的application.properties文件讀取是Spring Boot配置鏈中的一環(huán)而已。

根據(jù)Spring Boot的文檔,配置使用的優(yōu)先級(jí)從高到低的順序毯盈,具體如下所示:

1. 命令行參數(shù)剃毒。
2. 通過 System.getProperties() 獲取的 Java 系統(tǒng)參數(shù)。
3. 操作系統(tǒng)環(huán)境變量搂赋。
4. 從 java:comp/env 得到的 JNDI 屬性赘阀。
5. 通過 RandomValuePropertySource 生成的“random.*”屬性。
6. 應(yīng)用 Jar 文件之外的屬性文件(application.properties)脑奠。
7. 應(yīng)用 Jar 文件內(nèi)部的屬性文件(application.properties)基公。
8. 在應(yīng)用配置 Java 類(包含“@Configuration”注解的 Java 類)中通過“@PropertySource”注解聲明的屬性文件。
9. 通過“SpringApplication.setDefaultProperties”聲明的默認(rèn)屬性宋欺。

這意味著轰豆,如果Spring Boot在優(yōu)先級(jí)更高的位置找到了配置,那么它就會(huì)無視低級(jí)的配置齿诞。

比如酸休,我在application.properties目錄中,寫入本地的MySQL的配置:

db.jdbc.driver=com.mysql.jdbc.Driver
db.jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
db.jdbc.username=username
db.jdbc.password=password

在自己項(xiàng)目調(diào)試的階段祷杈,項(xiàng)目總是會(huì)使用本地的MySQL數(shù)據(jù)庫斑司。而一旦打包之后,在外部聲明一個(gè)test_evn.properties.

啟動(dòng)Jar包的時(shí)候, 指定一個(gè)外部配置文件:

java -jar demo.jar --spring.config.location=/path/test_evn.properties

這樣一來但汞,我們?cè)陂_發(fā)者的機(jī)器上總是使用自己的配置陡厘,而一到對(duì)應(yīng)的環(huán)境,就會(huì)使用高級(jí)的位置所做的配置特占。

在代碼中讀取這些配置也是非常方便的糙置,在代碼的邏輯中,其實(shí)是無需去關(guān)心這個(gè)配置是從什么地方來的是目,只用關(guān)注能獲取什么配置就夠了谤饭。

public class ApplicationConfigure {

    @Value("${db.jdbc.driver}")
    private String jdbcDriver;
    @Value("${db.jdbc.url}")
    private String jdbcUrl;
    @Value("${db.jdbc.username}")
    private String jdbcUsername;
    @Value("${db.jdbc.password}")
    private String jdbcPassword;
    
    // mysql config class
    // ..... 
    
}

有時(shí)候我們?cè)陧?xiàng)目啟動(dòng)的時(shí)候,總是需要先啟動(dòng)一些初始化的類懊纳,以前比較常見的做法是寫再static塊中揉抵,Spring Boot提供了一個(gè)CommandLineRunner接口,實(shí)現(xiàn)這個(gè)接口的類總是會(huì)被優(yōu)先啟動(dòng)嗤疯,并優(yōu)先執(zhí)行CommandLineRunner接口中提供的run()方法冤今。

public class ApplicationConfigure implements CommandLineRunner  {

    @Value("${db.jdbc.driver}")
    private String jdbcDriver;
    @Value("${db.jdbc.url}")
    private String jdbcUrl;
    @Value("${db.jdbc.username}")
    private String jdbcUsername;
    @Value("${db.jdbc.password}")
    private String jdbcPassword;
    
    // mysql config class
    // ..... 
    @Override
    public void run(String... strings) throws Exception {
        // 預(yù)先加載的一些方法,類茂缚,屬性戏罢。
    }
}

如果有多個(gè)CommandLineRunner接口實(shí)現(xiàn)類屋谭,那么可以通過注解@Order來規(guī)定所有實(shí)現(xiàn)類的運(yùn)行順序。

通過這一系列API的幫助龟糕,Spring Boot讓環(huán)境配置變得輕松很多桐磁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讲岁,隨后出現(xiàn)的幾起案子我擂,更是在濱河造成了極大的恐慌,老刑警劉巖缓艳,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件校摩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡阶淘,警方通過查閱死者的電腦和手機(jī)衙吩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舶治,“玉大人分井,你說我怎么就攤上這事车猬∶姑停” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵珠闰,是天一觀的道長(zhǎng)惜浅。 經(jīng)常有香客問我,道長(zhǎng)伏嗜,這世上最難降的妖魔是什么坛悉? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮承绸,結(jié)果婚禮上裸影,老公的妹妹穿的比我還像新娘。我一直安慰自己军熏,他們只是感情好轩猩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荡澎,像睡著了一般均践。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摩幔,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天彤委,我揣著相機(jī)與錄音,去河邊找鬼或衡。 笑死焦影,一個(gè)胖子當(dāng)著我的面吹牛车遂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播偷办,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼艰额,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了椒涯?” 一聲冷哼從身側(cè)響起柄沮,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎废岂,沒想到半個(gè)月后祖搓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡湖苞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年拯欧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财骨。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镐作,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隆箩,到底是詐尸還是另有隱情该贾,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布捌臊,位于F島的核電站杨蛋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏理澎。R本人自食惡果不足惜逞力,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望糠爬。 院中可真熱鬧寇荧,春花似錦、人聲如沸执隧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殴玛。三九已至捅膘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滚粟,已是汗流浹背寻仗。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凡壤,地道東北人署尤。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓耙替,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親曹体。 傳聞我的和親對(duì)象是個(gè)殘疾皇子俗扇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容