最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入剖析SpringBoot配置文件加載順序(一場(chǎng)配置界的權(quán)力游戲)

 更新時(shí)間:2026年01月28日 10:56:36   作者:科威舟的代碼筆記  
這篇文章給大家介紹SpringBoot配置文件的加載順序,從配置文件的優(yōu)先級(jí)、加載位置、文件類型優(yōu)先級(jí),到實(shí)戰(zhàn)場(chǎng)景解析和底層原理,通過(guò)實(shí)戰(zhàn)場(chǎng)景解析,感興趣的朋友跟隨小編一起看看吧

深入理解配置的加載順序,讓SpringBoot應(yīng)用配置管理更得心應(yīng)手

你是否曾經(jīng)遇到過(guò)這樣的場(chǎng)景:在配置文件中設(shè)置了一個(gè)參數(shù),但應(yīng)用啟動(dòng)后卻發(fā)現(xiàn)它沒(méi)有按預(yù)期生效?或者在生產(chǎn)環(huán)境中部署時(shí),某些配置莫名其妙被覆蓋了?這很可能是因?yàn)槟銢](méi)有完全掌握SpringBoot配置文件的加載順序。

今天,我們就來(lái)深入剖析SpringBoot配置文件的加載機(jī)制,讓你徹底理解這一重要主題。

一、配置世界的"權(quán)力金字塔"

想象一下,SpringBoot的配置系統(tǒng)就像一個(gè)公司的決策層級(jí)。命令行參數(shù)是CEO,擁有最高決定權(quán);系統(tǒng)環(huán)境變量是部門總監(jiān),權(quán)力很大但還得聽(tīng)CEO的;而項(xiàng)目?jī)?nèi)的配置文件則是基層員工,雖然數(shù)量多但權(quán)力最小。

SpringBoot官方定義的配置優(yōu)先級(jí)從高到低如下:

  1. 命令行參數(shù)(如java -jar app.jar --server.port=8081
  2. 來(lái)自SPRING_APPLICATION_JSON的屬性(環(huán)境變量或系統(tǒng)屬性中的JSON配置)
  3. 系統(tǒng)屬性(通過(guò)-D參數(shù)設(shè)置的值)
  4. 操作系統(tǒng)環(huán)境變量
  5. 隨機(jī)生成的屬性(如隨機(jī)端口號(hào))
  6. 應(yīng)用配置文件(application.propertiesapplication.yml
  7. @Configuration類中通過(guò)@PropertySource注解定義的屬性
  8. 默認(rèn)屬性(通過(guò)SpringApplication.setDefaultProperties指定)

簡(jiǎn)單來(lái)說(shuō):離應(yīng)用越近的配置方式,優(yōu)先級(jí)越低;越"外部"、越"臨時(shí)"的配置方式,優(yōu)先級(jí)越高。 這一設(shè)計(jì)理念確保了部署時(shí)的靈活性——你可以在不修改應(yīng)用代碼的情況下,通過(guò)外部配置改變應(yīng)用行為。

二、配置文件加載的具體順序

2.1 配置文件位置的優(yōu)先級(jí)

當(dāng)涉及到具體的配置文件時(shí),SpringBoot按照以下順序加載(優(yōu)先級(jí)從高到低):

  1. 命令行中指定的配置文件(通過(guò)--spring.config.location參數(shù))
  2. 項(xiàng)目目錄下的config子目錄(與jar包同級(jí))
  3. 項(xiàng)目根目錄(與jar包同級(jí))
  4. 類路徑下的config包(src/main/resources/config
  5. 類路徑根目錄(src/main/resources

注意:SpringBoot 2.4.0之后版本調(diào)整了加載順序,將file:./config/*/提升至第一加載位置。

2.2 文件類型優(yōu)先級(jí)

在同一位置下,如果存在多種類型的配置文件,它們的優(yōu)先級(jí)順序?yàn)椋?/p>

  1. .properties
  2. .yml
  3. .yaml

有趣的是,雖然YAML文件在功能上更強(qiáng)大,但在優(yōu)先級(jí)方面卻低于Properties文件。這意味著當(dāng)同一位置存在同名但不同后綴的配置文件時(shí),Properties文件中的配置會(huì)覆蓋YAML文件中的配置。

三、實(shí)戰(zhàn)場(chǎng)景解析

3.1 單機(jī)應(yīng)用配置加載實(shí)戰(zhàn)

假設(shè)我們有一個(gè)簡(jiǎn)單的SpringBoot應(yīng)用,打包后為myapp.jar,目錄結(jié)構(gòu)如下:

.
├── myapp.jar
├── application.properties(server.port=8001)
├── config/
│   └── application.properties(server.port=8002)
└── src/main/resources/
    ├── application.properties(server.port=8003)
    └── config/
        └── application.properties(server.port=8004)

應(yīng)用啟動(dòng)后,最終生效的端口號(hào)是多少呢?

根據(jù)加載順序,外部config目錄的優(yōu)先級(jí)最高,因此會(huì)使用config/application.properties中的配置,即端口號(hào)為8002。

實(shí)戰(zhàn)技巧:將通用的配置放在jar包內(nèi)部的配置文件中,將環(huán)境相關(guān)的配置放在外部的配置文件中。這樣既保證了代碼的可移植性,又兼顧了部署的靈活性。

3.2 微服務(wù)場(chǎng)景下的配置加載

在微服務(wù)架構(gòu)中,SpringBoot引入了bootstrap配置文件的概念。這些配置文件主要用于應(yīng)用程序上下文的引導(dǎo)階段,特別是從配置服務(wù)器加載配置時(shí)使用。

微服務(wù)場(chǎng)景下的加載順序?yàn)椋?/p>

  1. bootstrap.yml
  2. bootstrap.properties
  3. application.yml
  4. application.properties

為什么需要這種機(jī)制?因?yàn)樵谖⒎?wù)中,應(yīng)用需要先從配置中心獲取必要的配置信息(如連接數(shù)據(jù)庫(kù)的憑據(jù)),然后才能正常啟動(dòng)。bootstrap配置文件正是為此而生。

3.3 多環(huán)境配置處理

在實(shí)際開(kāi)發(fā)中,我們通常需要為不同環(huán)境(開(kāi)發(fā)、測(cè)試、生產(chǎn))提供不同的配置。SpringBoot通過(guò)spring.profiles.active屬性支持這一點(diǎn)。

假設(shè)有以下配置文件:

  • application.yml(通用配置)
  • application-dev.yml(開(kāi)發(fā)環(huán)境配置)
  • application-prod.yml(生產(chǎn)環(huán)境配置)

當(dāng)使用--spring.profiles.active=prod啟動(dòng)應(yīng)用時(shí),會(huì)加載application.ymlapplication-prod.yml,且后者的配置會(huì)覆蓋前者中的相同屬性。

高級(jí)技巧:可以同時(shí)激活多個(gè)profile,例如--spring.profiles.active=dev,db-mysql。SpringBoot會(huì)按照從左到右的順序加載配置,右邊的配置覆蓋左邊的配置。

四、配置加載的底層原理

要真正理解配置加載順序,我們需要簡(jiǎn)單了解其底層機(jī)制。

SpringBoot啟動(dòng)時(shí),會(huì)初始化各種屬性源(PropertySource),并把它們存放到Environment的propertySourceList中。這個(gè)List是一個(gè)CopyOnWriteArrayList,即線程安全的ArrayList。

當(dāng)應(yīng)用需要獲取某個(gè)屬性值時(shí),會(huì)按照propertySourceList的順序從前往后查找,一旦找到就立即返回。這意味著在列表中位置靠前的屬性源有更高的優(yōu)先級(jí)。

有趣的是,配置的加載順序和生效順序并不完全一致。有些配置源雖然較早被加載,但最終在propertySourceList中的位置可能較靠后,因此優(yōu)先級(jí)較低。

五、高級(jí)用法與最佳實(shí)踐

5.1 自定義配置文件位置和名稱

如果你不想使用默認(rèn)的application作為配置文件名,可以通過(guò)spring.config.name屬性自定義:

java -jar myapp.jar --spring.config.name=myconfig

同樣,你也可以自定義配置文件的位置:

java -jar myapp.jar --spring.config.location=optional:classpath:/config/,optional:file:./config/

使用optional:前綴可以忽略文件不存在的錯(cuò)誤,防止因缺少配置文件而啟動(dòng)失敗。

5.2 導(dǎo)入外部配置

SpringBoot 2.4.0及以上版本支持使用spring.config.import屬性在配置文件中導(dǎo)入其他配置:

# application.yml
spring:
  config:
    import:
      - optional:file:.env[.properties]
      - configtree:/etc/config/

這種機(jī)制允許你將配置分散到多個(gè)文件中,提高配置的可維護(hù)性。

5.3 屬性覆蓋策略理解

配置加載過(guò)程中的一個(gè)關(guān)鍵特性是:高優(yōu)先級(jí)配置會(huì)覆蓋低優(yōu)先級(jí)配置,但不同配置會(huì)進(jìn)行合并。

舉個(gè)例子:

  • 優(yōu)先級(jí)高的配置文件中設(shè)置:server.port=8081
  • 優(yōu)先級(jí)低的配置文件中設(shè)置:server.servlet.context-path=/api
  • 最終結(jié)果:端口號(hào)為8081(高優(yōu)先級(jí)),上下文路徑為/api(合并低優(yōu)先級(jí))

六、常見(jiàn)問(wèn)題與解決方案

6.1 配置屬性不生效怎么辦?

當(dāng)發(fā)現(xiàn)配置屬性沒(méi)有按預(yù)期生效時(shí),可以按照以下步驟排查:

  1. 檢查屬性名的拼寫(xiě)是否正確(SpringBoot支持松散綁定,但大小寫(xiě)和分隔符需一致)
  2. 確認(rèn)配置所在文件的加載順序
  3. 使用--debug參數(shù)啟動(dòng)應(yīng)用,查看自動(dòng)配置報(bào)告
  4. 通過(guò)Environment端點(diǎn)(如果已啟用)查看所有屬性源及其值

6.2 如何確保敏感配置的安全?

對(duì)于密碼、密鑰等敏感配置,建議:

  1. 不要將敏感信息提交到代碼倉(cāng)庫(kù)
  2. 使用外部配置文件或環(huán)境變量管理敏感數(shù)據(jù)
  3. 考慮使用專業(yè)的配置管理工具(如Spring Cloud Config、HashiCorp Vault等)

七、總結(jié)

SpringBoot配置文件的加載順序是一個(gè)看似簡(jiǎn)單實(shí)則復(fù)雜的主題。通過(guò)本文的分析,我們應(yīng)該掌握以下核心要點(diǎn):

  1. 優(yōu)先級(jí)原則:外部配置優(yōu)于內(nèi)部配置,臨時(shí)配置優(yōu)于持久配置
  2. 覆蓋策略:高優(yōu)先級(jí)配置覆蓋低優(yōu)先級(jí)配置,不重復(fù)的配置內(nèi)容會(huì)合并
  3. 微服務(wù)差異:微服務(wù)環(huán)境中bootstrap配置文件先于application配置文件加載
  4. 設(shè)計(jì)理念:SpringBoot的配置系統(tǒng)設(shè)計(jì)體現(xiàn)了"約定優(yōu)于配置"的理念,同時(shí)為特殊需求提供了足夠的靈活性

正確理解配置加載順序,不僅能避免常見(jiàn)的配置問(wèn)題,還能讓我們更好地規(guī)劃應(yīng)用配置結(jié)構(gòu),提高開(kāi)發(fā)和部署效率。

希望本文能幫助你徹底掌握SpringBoot配置文件的加載機(jī)制。如果你有任何問(wèn)題或獨(dú)到見(jiàn)解,歡迎在評(píng)論區(qū)留言討論!

參考資料

  1. https://www.cfanz.cn/resource/detail/OmoRXmGJmzVkL
  2. https://blog.csdn.net/m0_73257876/article/details/126673993
  3. https://blog.51cto.com/u_15905482/5920082
  4. https://cloud.tencent.com/developer/article/2442107
  5. https://www.womengda.net/nav/java/87673.html
  6. https://blog.csdn.net/zzhongcy/article/details/107200796
  7. https://blog.51cto.com/u_16542656/11731229
  8. https://blog.csdn.net/weixin_39855568/article/details/111739922

到此這篇關(guān)于SpringBoot配置文件加載順序:一場(chǎng)配置界的權(quán)力游戲的文章就介紹到這了,更多相關(guān)SpringBoot配置文件加載順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot+JavaMailSender實(shí)現(xiàn)騰訊企業(yè)郵箱配置

    SpringBoot+JavaMailSender實(shí)現(xiàn)騰訊企業(yè)郵箱配置

    這篇文章主要介紹了SpringBoot+JavaMailSender實(shí)現(xiàn)騰訊企業(yè)郵箱配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringMvc入門指南(必看)

    SpringMvc入門指南(必看)

    下面小編就為大家?guī)?lái)一篇SpringMvc入門指南(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • elasticsearch插件開(kāi)發(fā)教程

    elasticsearch插件開(kāi)發(fā)教程

    這篇文章主要為大家詳細(xì)介紹了elasticsearch插件開(kāi)發(fā)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringBoot集成E-mail發(fā)送各種類型郵件

    SpringBoot集成E-mail發(fā)送各種類型郵件

    這篇文章主要為大家詳細(xì)介紹了SpringBoot集成E-mail發(fā)送各種類型郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java GZip 基于磁盤實(shí)現(xiàn)壓縮和解壓的方法

    Java GZip 基于磁盤實(shí)現(xiàn)壓縮和解壓的方法

    這篇文章主要介紹了Java GZip 基于磁盤實(shí)現(xiàn)壓縮和解壓,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考需要的朋友可以參考下
    2020-08-08
  • 使用MybatisPlus實(shí)現(xiàn)sql日志打印優(yōu)化

    使用MybatisPlus實(shí)現(xiàn)sql日志打印優(yōu)化

    本文主要介紹了使用MybatisPlus實(shí)現(xiàn)sql日志打印優(yōu)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • SpringBoot靜態(tài)資源及原理解析

    SpringBoot靜態(tài)資源及原理解析

    這篇文章主要介紹了SpringBoot靜態(tài)資源及原理解析,當(dāng)創(chuàng)建一個(gè)jar工程時(shí),想引入css等靜態(tài)資源時(shí),需要遵守SpringBoot的靜態(tài)資源映射關(guān)系,通過(guò)WebMvcAutoConfiguration查看靜態(tài)配置資源的規(guī)則,需要的朋友可以參考下
    2023-12-12
  • Java設(shè)計(jì)模式之接口隔離原則精解

    Java設(shè)計(jì)模式之接口隔離原則精解

    設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_(kāi)發(fā)人員所采用。設(shè)計(jì)模式是軟件開(kāi)發(fā)人員在軟件開(kāi)發(fā)過(guò)程中面臨的一般問(wèn)題的解決方案。本篇介紹設(shè)計(jì)模式七大原則之一的接口隔離原則
    2022-02-02
  • Java使用volatile關(guān)鍵字的注意事項(xiàng)

    Java使用volatile關(guān)鍵字的注意事項(xiàng)

    volatile關(guān)鍵字是Java中的一種稍弱的同步機(jī)制,為什么稱之為弱機(jī)制。這篇文章主要介紹了Java使用volatile關(guān)鍵字的注意事項(xiàng),需要的朋友可以參考下
    2017-02-02
  • Java如何通過(guò)SSE實(shí)現(xiàn)消息推送詳解

    Java如何通過(guò)SSE實(shí)現(xiàn)消息推送詳解

    這篇文章主要介紹了Java如何通過(guò)SSE實(shí)現(xiàn)消息推送的相關(guān)資料,SSE是一種服務(wù)器向客戶端推送數(shù)據(jù)的技術(shù),基于HTTP協(xié)議,利用長(zhǎng)連接特性,它適用于單向數(shù)據(jù)流場(chǎng)景,如股票價(jià)格更新、新聞實(shí)時(shí)推送等,需要的朋友可以參考下
    2025-04-04

最新評(píng)論

白水县| 梨树县| 新巴尔虎右旗| 西华县| 磐安县| 淮安市| 襄樊市| 拜泉县| 龙游县| 福贡县| 龙川县| 渭南市| 开封市| 策勒县| 高碑店市| 启东市| 定南县| 西峡县| 临清市| 浦江县| 红河县| 平罗县| 犍为县| 安溪县| 平武县| 民丰县| 闸北区| 丽江市| 凤山市| 井冈山市| 忻州市| 石狮市| 麻城市| 贞丰县| 西安市| 静安区| 襄城县| 乌拉特前旗| 大同县| 濮阳市| 荣成市|