SpringBoot2.x基礎(chǔ)篇:靈活的使用外部化配置信息

知識改變命運(yùn),擼碼使我快樂妇汗,2020繼續(xù)游走在開源界

點(diǎn)贊再看际歼,養(yǎng)成習(xí)慣

給我來個Star吧,點(diǎn)擊了解下基于SpringBoot的組件化接口服務(wù)落地解決方案

SpringBoot提供了內(nèi)部配置application.yml文件的方式來進(jìn)行全局配置得运,還支持使用profiles來激活不同環(huán)境下使用不同的配置文件膝蜈,而這種方式畢竟是已經(jīng)打包完成了,因此存在一定的局限性熔掺,像數(shù)據(jù)庫特殊敏感配置也可能存在泄露的風(fēng)險饱搏,如何解決這種問題呢?我們來看看本章要講到的外部配置的方式吧V寐摺M品小!

推薦閱讀

前言

SpringBoot提供了多種的外部化配置方式券坞,主要是為了方便在不同的環(huán)境中運(yùn)行相同的代碼鬓催。

我們可以通過Properties文件YAML文件恨锚、環(huán)境變量宇驾、命令行參數(shù)等來配置,獲取配置的值時可以通過@Value注解進(jìn)行注入猴伶,也可以使用@ConfigurationProperties注解進(jìn)行層級結(jié)構(gòu)化綁定到實(shí)體類的字段中课舍。

加載順序

SpringBoot配置參數(shù)存在一定的順序,當(dāng)然對相同名稱的屬性配置他挎,會因?yàn)榧虞d的優(yōu)先級存在覆蓋筝尾,順序如下所示:

  1. DevTools全局設(shè)置屬性
  2. @TestPropertySource注解
  3. properties測試中的屬性
  4. 命令行參數(shù)
  5. SPRING_APPLICATION_JSON屬性配置(嵌入在環(huán)境變量或者系統(tǒng)屬性中的嵌入式JSON字符串)
  6. ServletConfig初始化參數(shù)
  7. ServletContext初始化參數(shù)
  8. JNDI屬性java:comp/env
  9. Java系統(tǒng)屬性
  10. 操作系統(tǒng)環(huán)境變量
  11. 打包在jar內(nèi)的配置文件(application.propertiesYAML文件)
  12. @PropertySource注解
  13. 默認(rèn)屬性(通過SpringApplication.setDefaultProperties設(shè)置)

配置示例

我們從上面挑選幾種來進(jìn)行測試下配置輸出,首先創(chuàng)建一個名為LoadConfig的配置類雇盖,內(nèi)容如下所示:

/**
 * 加載配置類
 *
 * @author 恒宇少年
 */
@Configuration
public class LoadConfig {
    /**
     * 配置讀取name屬性忿等,不存在時使用空字符為默認(rèn)值
     */
    @Value("${name:''}")
    private String name;

    public String getName() {
        return name;
    }
}

LoadConfig配置類中栖忠,我們添加了一個name字段崔挖,由于該字段使用了@Value注解贸街,所以它的值會從配置環(huán)境中加載名為name的屬性值(配置的方式并沒有限制)。

為了方便演示狸相,我們在應(yīng)用程序啟動時通過實(shí)現(xiàn)CommandLineRunner接口在啟動成功后輸出name的值薛匪,SpringBootApplication入口類代碼如下所示:

/**
 * 啟動類入口
 */
@SpringBootApplication
public class SpringBootBasicExternalizedConfigurationApplication implements CommandLineRunner {
    /**
     * 注入配置類{@link LoadConfig}
     */
    @Autowired
    private LoadConfig loadConfig;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootBasicExternalizedConfigurationApplication.class, args);
    }


    @Override
    public void run(String... args) throws Exception {
        System.out.println("name config value:" + loadConfig.getName());
    }
}

YAML文件配置

這種我們在開發(fā)應(yīng)用程序中最常用的方式,只需要在src/main/resources目錄下創(chuàng)建一個名為application.yml的配置文件脓鹃,然后在該文件內(nèi)添加對應(yīng)屬性名稱的配置逸尖,如下所示:

# 配置name屬性
name:
  default

我們?nèi)绻苯訂討?yīng)用程序,會在控制臺輸出name的值為default瘸右。

注意事項(xiàng):application.ymlapplication.properties作用娇跟、優(yōu)先級相同,只是配置的展現(xiàn)形式不一樣而已太颤,我個人更喜歡YAML文件的形式苞俘,層級分明,閱讀性高一些龄章。

命令行環(huán)境變量配置

在執(zhí)行java -jar啟動應(yīng)用程序時吃谣,可以通過添加SPRING_APPLICATION_JSON配置來進(jìn)行自定義屬性配置,該配置是一個JSON字符串的形式做裙,使用方式如下所示:

SPRING_APPLICATION_JSON='{"name":"system_env"}' java -jar spring-boot-basic-externalized-configuration-0.0.1-SNAPSHOT.jar

運(yùn)行結(jié)果:這種方式啟用應(yīng)用程序時岗憋,會在控制臺輸出name的值為system_env

命令行參數(shù)配置

命令行參數(shù)這種方式也比較常用锚贱,通過--進(jìn)行配置仔戈,比較常見的命令--spring.profiles.active,啟動時用于修改激活的profile拧廊,而我們?nèi)绻胍薷?code>name屬性配置的值杂穷,如下所示:

java -jar spring-boot-basic-externalized-configuration-0.0.1-SNAPSHOT.jar --name=hengboy

或者使用--spring.application.json方式也可以配置,如下所示:

java -jar spring-boot-basic-externalized-configuration-0.0.1-SNAPSHOT.jar --spring.application.json='{"name":"hengboy"}'

運(yùn)行結(jié)果:以上兩種方式都可以卦绣,控制臺都會輸出name的值為hengboy耐量。

Java系統(tǒng)屬性配置

Java系統(tǒng)屬性的方式進(jìn)行配置時,不僅使用@Value可以獲取到屬性值滤港,使用java.lang.System#getProperty(java.lang.String)方法也是可以獲取到的廊蜒,通過-D進(jìn)行配置,如下所示:

java -Dname=JavaSystemConfig -jar spring-boot-basic-externalized-configuration-0.0.1-SNAPSHOT.jar

或者使用-Dspring.application.json方式配置(這種方式使用System.getProperty方法無法獲取到屬性值)溅漾,如下所示:

java -Dspring.application.json='{"name":"JavaSystemConfig"}' -jar spring-boot-basic-externalized-configuration-0.0.1-SNAPSHOT.jar

運(yùn)行結(jié)果:以上兩種方式啟動應(yīng)用程序山叮,控制臺會輸出name的值為JavaSystemConfig

注意事項(xiàng):Java屬性配置必須在-jar xxx.jar之前添履,配置在后面無法讀取到屬性值屁倔。

總結(jié)

多樣化的配置屬性的方式,使SpringBoot變的是那么的靈活暮胧,如果有興趣可以把上面全部的配置方式都嘗試一遍锐借,你會有意想不到的收獲的问麸。

代碼示例

如果您喜歡本篇文章請為源碼倉庫點(diǎn)個Star,謝謝3琛Q下簟!
本篇文章示例源碼可以通過以下途徑獲取布轿,源碼分支為2.x哮笆,目錄為spring-boot-basic-externalized-configuration

作者個人 博客
使用開源框架 ApiBoot 助你成為Api接口服務(wù)架構(gòu)師

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汰扭,隨后出現(xiàn)的幾起案子稠肘,更是在濱河造成了極大的恐慌,老刑警劉巖萝毛,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件启具,死亡現(xiàn)場離奇詭異,居然都是意外死亡珊泳,警方通過查閱死者的電腦和手機(jī)鲁冯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來色查,“玉大人薯演,你說我怎么就攤上這事⊙砹耍” “怎么了跨扮?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長验毡。 經(jīng)常有香客問我衡创,道長,這世上最難降的妖魔是什么晶通? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任璃氢,我火速辦了婚禮,結(jié)果婚禮上狮辽,老公的妹妹穿的比我還像新娘一也。我一直安慰自己,他們只是感情好喉脖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布椰苟。 她就那樣靜靜地躺著,像睡著了一般树叽。 火紅的嫁衣襯著肌膚如雪舆蝴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音洁仗,去河邊找鬼层皱。 笑死,一個胖子當(dāng)著我的面吹牛京痢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播篷店,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼祭椰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疲陕?” 一聲冷哼從身側(cè)響起方淤,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹄殃,沒想到半個月后携茂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诅岩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年讳苦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吩谦。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸳谜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出式廷,到底是詐尸還是另有隱情咐扭,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布滑废,位于F島的核電站蝗肪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蠕趁。R本人自食惡果不足惜薛闪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俺陋。 院中可真熱鬧逛绵,春花似錦、人聲如沸倔韭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寿酌。三九已至胰苏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間醇疼,已是汗流浹背硕并。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工法焰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倔毙。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓埃仪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陕赃。 傳聞我的和親對象是個殘疾皇子卵蛉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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