Spring Boot 入門(mén)系列(二) 配置文件

文章使用版本為 Spring Boot 2.1.x

對(duì)應(yīng)進(jìn)階系列 Spring Boot 進(jìn)階系列(二) 配置文件

前言

寫(xiě)項(xiàng)目的時(shí)候少不了需要根據(jù)不同的運(yùn)行環(huán)境使用不同參數(shù)的情況,比如開(kāi)發(fā)環(huán)境使用開(kāi)發(fā)數(shù)據(jù)庫(kù)河劝,測(cè)試環(huán)境使用測(cè)試數(shù)據(jù)庫(kù),生產(chǎn)環(huán)境使用生產(chǎn)數(shù)據(jù)庫(kù)讯检。為了避免硬編碼,通常我們會(huì)把這些需要隨著運(yùn)行環(huán)境變化而變化的參數(shù)配置到配置文件中去孝扛,在 Spring Boot(一) Hello World中介紹過(guò)我們使用application.yml(或者application.properties)來(lái)保存我們的配置參數(shù)旺坠,現(xiàn)在我們來(lái)詳細(xì)學(xué)習(xí)下配置文件。

Spring Boot 自帶的可配置參數(shù)

spring boot 自帶了許多可配置的參數(shù)馋缅,具體可以參考spring-boot-autoconfig-x.x.x.RELEASE.jar => MATA-INFO => spring-configuration-matadata.json,屬性很多绢淀,我們就不一一介紹萤悴,這里我們只選取一個(gè)來(lái)做講解。

server:
  port: 就是我們的web服務(wù)啟動(dòng)的端口皆的,默認(rèn)值8080

大家可以試一下覆履,什么參數(shù)都不配置,啟動(dòng)項(xiàng)目,觀察啟動(dòng)日志硝全,看看服務(wù)啟動(dòng)的端口是不是8080栖雾;如果不想使用默認(rèn)值8080,就需要我們?cè)谂渲梦募惺謩?dòng)配置伟众,比如配置成8090析藕,重新啟動(dòng)項(xiàng)目,觀察下是否在8090端口啟動(dòng)凳厢。

自定義配置

spring boot自帶的配置能夠讓我們配置整個(gè)項(xiàng)目的基本參數(shù)账胧,但是如果我們需要配置一些和業(yè)務(wù)相關(guān)的參數(shù),spring boot就無(wú)能為力了先紫,這個(gè)時(shí)候需要我們自定義配置找爱,比如如下配置

someone:
  name: 張三
  age: 20
  best-friend: 李四

那么在配置文件里配置的參數(shù)如何在項(xiàng)目中使用呢?一般有2中辦法

  • 通過(guò)@Value注入到程序中泡孩,這種方法適合參數(shù)比較少,或者參數(shù)間沒(méi)什么關(guān)聯(lián)的情況
@Value("${someone.name}")
private String name;

@Value("${someone.age}")
private String age;

@Value("${someone.best-friend}")
private String bestFriend;
  • 如果你的參數(shù)非常多寺谤,且有非常強(qiáng)的關(guān)聯(lián)性仑鸥,使用上一種方法顯得比較繁瑣,這時(shí)候我們可以通過(guò)@ConfigurationProperties一次性把參數(shù)注入到Bean中变屁。
package org.schhx.springbootlearn.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties(prefix = "someone")
@Component
@Data
public class SomeoneProperties {

    private String name;

    private Integer age;

    private String bestFriend;
}

然后在使用的地方把Bean直接注入進(jìn)來(lái)就可以使用所有參數(shù)了

@Autowired
private SomeoneProperties someoneProperties;

多環(huán)境配置

現(xiàn)在我們已經(jīng)知道了如何配置參數(shù)眼俊,那么如何才能讓開(kāi)發(fā)環(huán)境使用開(kāi)發(fā)環(huán)境的參數(shù),測(cè)試環(huán)境使用測(cè)試環(huán)境的參數(shù)呢粟关?答案就是配置多個(gè)配置文件疮胖,然后指定使用一個(gè)。

我們現(xiàn)在已經(jīng)有了application.yml闷板,現(xiàn)在我們?cè)傩陆◣讉€(gè)文件application-default.yml澎灸、application-dev.yml、application-test.yml遮晚、application-prod.yml性昭。然后在application.yml添加一個(gè)參數(shù)

spring:
  profiles:
    active: dev

它表示我們現(xiàn)在使用application-dev.yml這個(gè)配置文件,當(dāng)然你也可以不配置县遣,默認(rèn)使用的是application-default.yml糜颠。

需要說(shuō)明的是,使用了application-*.yml并不是說(shuō)application.yml就不起作用了萧求,應(yīng)該是兩個(gè)都起作用其兴,只不過(guò)application-*.yml優(yōu)先級(jí)比較高,它會(huì)覆蓋掉application.yml中的同名屬性夸政。

我們可以做下測(cè)試元旬,在application.yml中配置以下參數(shù)

spring:
  profiles:
    active: dev
server:
  port: 8090

someone:
  name: 張三
  age: 20
  best-friend: 李四

在application-dev.yml中配置以下參數(shù)

server:
 port: 8081

啟動(dòng)項(xiàng)目,可以看到項(xiàng)目在8081端口啟動(dòng)

2018-01-21 09:35:46.725  INFO 22526 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)

然后訪問(wèn)someone的參數(shù),可以看到法绵,雖然application-dev.yml沒(méi)有配置someone箕速,我們依然可以訪問(wèn)到,說(shuō)明application.yml配置的參數(shù)依然有效朋譬。

Properties from @Value
name = 張三
age = 20
bestFriend = 李四

Properties from bean
SomeoneProperties(name=張三, age=20, bestFriend=李四)

一般我們可以把不隨著環(huán)境變化而變化的參數(shù)放在application.yml中盐茎,而那些隨著環(huán)境變化的參數(shù)放到application-*.yml當(dāng)中去。

使用命令行配置參數(shù)

除了使用配置文件徙赢,我們還可以使用命令行參數(shù)來(lái)來(lái)配置參數(shù)字柠。雖然我們?cè)赼pplication.yml中指定了使用的profile,但是這個(gè)是硬編碼進(jìn)去的狡赐,我們不可能每次換環(huán)境部署都去更改application.yml窑业,這時(shí)候我們就需要在命令行指定需要激活的profile。

java -jar target/spring-boot-config.jar --spring.profiles.active=test

啟動(dòng)項(xiàng)目枕屉,可以發(fā)現(xiàn)項(xiàng)目在8082端口啟動(dòng)

2018-01-21 09:54:43.374  INFO 22595 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8082 (http)

配置參數(shù)的優(yōu)先級(jí)

通過(guò)上面的學(xué)些我們應(yīng)該知道了參數(shù)優(yōu)先級(jí)的順序是

命令行參數(shù) > application-\*.yml > application.yml

現(xiàn)在我們?cè)賮?lái)試驗(yàn)下常柄,使用命令行啟動(dòng)項(xiàng)目

java -jar target/spring-boot-config.jar --spring.profiles.active=test --server.port=9090

可以看到項(xiàng)目在命令行指定的9090端口啟動(dòng)

2018-01-21 09:59:23.812  INFO 22609 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 9090 (http)

總結(jié)

我們主要學(xué)習(xí)了

  • 配置spring boot自帶的參數(shù)
  • 配置自定義參數(shù),并使用2種方法讀取
  • 多環(huán)境下如何配置和使用參數(shù)
  • 使用命令行配置參數(shù)
  • 介紹了多種方式配置參數(shù)的優(yōu)先級(jí)

完整示例

github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搀擂,一起剝皮案震驚了整個(gè)濱河市西潘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哨颂,老刑警劉巖喷市,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異威恼,居然都是意外死亡品姓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)箫措,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腹备,“玉大人,你說(shuō)我怎么就攤上這事斤蔓×蠼鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵附迷,是天一觀的道長(zhǎng)惧互。 經(jīng)常有香客問(wèn)我,道長(zhǎng)喇伯,這世上最難降的妖魔是什么喊儡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮稻据,結(jié)果婚禮上艾猜,老公的妹妹穿的比我還像新娘买喧。我一直安慰自己,他們只是感情好匆赃,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布淤毛。 她就那樣靜靜地躺著,像睡著了一般算柳。 火紅的嫁衣襯著肌膚如雪低淡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,850評(píng)論 1 290
  • 那天瞬项,我揣著相機(jī)與錄音蔗蹋,去河邊找鬼。 笑死囱淋,一個(gè)胖子當(dāng)著我的面吹牛猪杭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妥衣,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼皂吮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了税手?” 一聲冷哼從身側(cè)響起蜂筹,我...
    開(kāi)封第一講書(shū)人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冈止,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體候齿,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熙暴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慌盯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片周霉。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亚皂,靈堂內(nèi)的尸體忽然破棺而出俱箱,到底是詐尸還是另有隱情,我是刑警寧澤灭必,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布狞谱,位于F島的核電站,受9級(jí)特大地震影響禁漓,放射性物質(zhì)發(fā)生泄漏跟衅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一播歼、第九天 我趴在偏房一處隱蔽的房頂上張望伶跷。 院中可真熱鬧,春花似錦、人聲如沸叭莫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雇初。三九已至拢肆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抵皱,已是汗流浹背善榛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呻畸,地道東北人移盆。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像伤为,于是被迫代替她去往敵國(guó)和親咒循。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349