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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在同一位置下,如果存在多種類型的配置文件,它們的優(yōu)先級順序為:

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

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

三、實戰(zhàn)場景解析

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

假設(shè)我們有一個簡單的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)用啟動后,最終生效的端口號是多少呢?

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

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

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

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

微服務(wù)場景下的加載順序為:

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

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

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

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

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

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

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

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

四、配置加載的底層原理

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

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

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

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

五、高級用法與最佳實踐

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

如果你不想使用默認(rèn)的application作為配置文件名,可以通過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:前綴可以忽略文件不存在的錯誤,防止因缺少配置文件而啟動失敗。

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ī)制允許你將配置分散到多個文件中,提高配置的可維護(hù)性。

5.3 屬性覆蓋策略理解

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

舉個例子:

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

六、常見問題與解決方案

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

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

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

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

對于密碼、密鑰等敏感配置,建議:

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

七、總結(jié)

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

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

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

希望本文能幫助你徹底掌握SpringBoot配置文件的加載機(jī)制。如果你有任何問題或獨到見解,歡迎在評論區(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配置文件加載順序:一場配置界的權(quán)力游戲的文章就介紹到這了,更多相關(guān)SpringBoot配置文件加載順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

    SpringMvc入門指南(必看)

    下面小編就為大家?guī)硪黄猄pringMvc入門指南(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • elasticsearch插件開發(fā)教程

    elasticsearch插件開發(fā)教程

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

余姚市| 奉节县| 北川| 蚌埠市| 安乡县| 清水河县| 商水县| 黄平县| 牙克石市| 法库县| 湄潭县| 大新县| 扶余县| 达日县| 厦门市| 五原县| 怀集县| 淳化县| 吴川市| 娱乐| 临沭县| 泽普县| 柳林县| 明星| 雷山县| 台东市| 金溪县| 锡林浩特市| 安仁县| 清河县| 财经| 蓬安县| 曲阳县| 安远县| 广昌县| 登封市| 沭阳县| 合水县| 绥江县| 富源县| 龙井市|