Spring Boot 中 YAML 配置文件詳解

Spring Boot 中 YAML 配置文件詳解

在 Spring Boot 項目中,配置文件是不可或缺的一部分,用于自定義應用行為、覆蓋默認設置。除了傳統的 properties 文件,Spring Boot 對 YAML(YAML Ain’t Markup Language)格式提供了完美支持。YAML 以其簡潔的語法、清晰的層級結構,成為許多開發者的首選配置方式。

一、YAML 是什么?為什么用 YAML?

YAML 是一種數據序列化格式,設計目標是易讀易寫,同時兼顧機器解析效率。與傳統的 properties 文件相比,YAML 具有以下優勢:

  • 層級結構清晰:通過縮進表示配置之間的父子關系,避免了 properties 中重復的前綴(如 server.portserver.servlet.context-path)。
  • 支持復雜數據類型:原生支持對象、列表、Map 等復雜結構,無需額外語法。
  • 語法簡潔:去掉了 properties 中的等號和多余標點,減少冗余代碼。

Spring Boot 會自動加載 resources 目錄下的 application.ymlapplication.yaml 文件,其優先級與 application.properties 一致(可通過配置位置調整優先級)。

二、YAML 基礎語法規則

使用 YAML 時,需遵守以下核心規則,否則可能導致配置加載失敗:

  1. 大小寫敏感nameName 代表不同的配置項。
  2. 縮進表示層級:使用空格(不允許使用 Tab)縮進,縮進數量不限,但同級配置必須對齊。
  3. 鍵值對格式:鍵與值之間用冒號加空格分隔(如 key: value),冒號后必須有空格。
  4. 注釋:以 # 開頭的行為注釋,會被忽略。
  5. 字符串無需引號:默認情況下,字符串可以不加引號;若包含特殊字符(如空格、冒號),需用單引號或雙引號包裹。

示例:

# 基本鍵值對
server:port: 8080  # 端口配置servlet:context-path: /demo  # 上下文路徑# 字符串配置(含特殊字符)
app:title: "Spring Boot: YAML 教程"  # 雙引號保留特殊字符description: 'Hello: World'      # 單引號也支持

三、YAML 配置常見數據類型

YAML 支持多種數據類型,從簡單值到復雜結構均可輕松表示,以下是開發中常用的類型及示例:

1. 簡單數據類型

包括字符串、數字、布爾值等,直接以 key: value 形式定義:

# 簡單數據類型示例
user:id: 1001          # 數字name: 張三         # 字符串isVip: true        # 布爾值score: 98.5        # 浮點數joinDate: 2023-10-01  # 日期(字符串形式)

2. 對象類型

用于表示包含多個屬性的實體,支持兩種寫法:

  • 縮進式:通過縮進體現屬性層級。
  • 行內式:用 {} 包裹,屬性之間用逗號分隔。

示例:

# 對象配置(縮進式)
user1:name: 張三age: 20address: 北京# 對象配置(行內式)
user2: {name: 李四, age: 22, address: 上海}

3. 集合類型

包括列表(List)和集合(Set),支持兩種寫法:

  • 短橫線式:每個元素前加 - (短橫線+空格)。
  • 行內式:用 [] 包裹,元素之間用逗號分隔。

示例:

# 列表配置(短橫線式)
city1:- 北京- 上海- 廣州# 列表配置(行內式)
city2: [北京, 上海, 廣州]# 集合中的元素是對象
students:- id: 1name: 張三age: 20- id: 2name: 李四age: 22

?? 注意:短橫線與元素值之間必須有空格,否則會解析錯誤 。

四、Spring Boot 中 YAML 的核心應用

1. 覆蓋默認配置

Spring Boot 有許多默認配置(如 Tomcat 端口、日志級別等),可通過 YAML 覆蓋:

# 覆蓋服務器配置
server:port: 8888  # 端口改為 8888(默認 8080)tomcat:max-threads: 200  # Tomcat 最大線程數# 日志配置
logging:level:root: info  # 根日志級別com.example: debug  # 自定義包日志級別

2. 自定義配置與讀取

除了框架默認配置,還可在 YAML 中定義自定義配置,再通過代碼讀取使用。

方式 1:@Value 注解(適合簡單配置)

@Value 可直接映射 YAML 中的簡單值(如字符串、數字),語法為 ${key}

# 自定義配置
app:name: 我的應用version: 1.0.0authors:- 張三- 李四

代碼中讀取:

@Controller
public class YamlController {@Value("${app.name}")private String appName;  // 映射 "我的應用"@Value("${app.version}")private String appVersion;  // 映射 "1.0.0"@Value("${app.authors[0]}")  // 讀取列表第一個元素private String firstAuthor;  // 映射 "張三"// 業務方法...
}

?? 注意:@Value 僅支持簡單類型,無法直接映射對象或復雜集合 。

方式 2:@ConfigurationProperties(適合對象/復雜配置)

當配置項較多或為對象結構時,推薦使用 @ConfigurationProperties 將配置批量映射到實體類:

  1. 定義實體類并綁定配置前綴:
@Component
@ConfigurationProperties(prefix = "user")  // 綁定前綴 "user"
public class UserConfig {private Integer id;private String name;private List<String> address;  // 映射列表// getter + setter(必須存在,否則無法綁定)
}
  1. YAML 配置:
# 用戶配置(與實體類對應)
user:id: 1001name: 張三address:- 北京- 上海
  1. 使用時直接注入實體類:
@Controller
public class UserController {@Autowiredprivate UserConfig userConfig;  // 自動注入配置@GetMapping("/user")@ResponseBodypublic String getUser() {return "ID: " + userConfig.getId() + ", 姓名: " + userConfig.getName();}
}

3. 占位符與動態配置

YAML 支持通過 ${} 引用其他配置項或使用框架提供的工具類生成動態值:

引用其他配置
server:port: 8080
app:url: http://localhost:${server.port}/demo  # 引用 server.port 的值
生成隨機值

Spring Boot 提供 random 工具類,可生成隨機數、UUID 等:

# 隨機值示例
config:randomInt: ${random.int}  # 隨機整數randomIntRange: ${random.int(100, 200)}  # 100-200 之間的隨機整數randomUUID: ${random.uuid}  # 隨機 UUIDrandomLong: ${random.long}  # 隨機長整數

五、YAML 配置文件的優先級

Spring Boot 會從多個位置加載 application.yml,優先級從高到低如下(高優先級配置會覆蓋低優先級):

  1. 項目根目錄下的 /config 子目錄(./config/application.yml
  2. 項目根目錄(./application.yml
  3. resources 目錄下的 /config 子目錄(classpath:/config/application.yml
  4. resources 目錄(classpath:/application.yml

可根據需求將配置文件放在不同位置,例如:

  • 開發環境配置放在 resources/config 中,方便修改。
  • 生產環境配置放在項目根目錄的 config 中,避免打包到 Jar 包內。

六、常見問題與解決方案

  1. 配置不生效?

    • 檢查語法:是否漏寫冒號后的空格、縮進是否正確。
    • 檢查路徑:配置文件是否在 resources 目錄或指定的優先級目錄中。
    • 檢查注解:使用 @ConfigurationProperties 時,確保實體類有 getter/setter 方法。
  2. 中文亂碼?

    • 確保 YAML 文件編碼為 UTF-8(IDEA 中可在 File -> Settings -> Editor -> File Encodings 中設置)。
  3. 如何區分多環境?

    • 創建多環境配置文件,如 application-dev.yml(開發)、application-prod.yml(生產),通過 spring.profiles.active=dev 指定激活環境。

總結

YAML 以其簡潔的語法和強大的表達能力,成為 Spring Boot 配置的優選格式。掌握 YAML 的基礎語法、數據類型映射及實戰技巧,能顯著提升配置文件的可讀性和維護性。在實際開發中,建議結合 @ConfigurationProperties 管理復雜配置,并合理利用多環境配置和優先級規則,讓配置更加靈活高效。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92413.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92413.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Milvus安裝可視化工具,attu,保姆級

安裝包鏈接&#xff1a;GitHub - zilliztech/attu: Web UI for Milvus Vector Databasehttps://github.com/zilliztech/attu?tabreadme-ov-file 下滑 舉例&#xff1a;windows&#xff1a;下載安裝&#xff0c;然后就可以連接了&#xff08;安裝完打開后如果需要輸入用戶名密碼…

避免“卡脖子”!如何減少內存I/O延遲對程序的影響?

單來說&#xff0c;內存 IO 就像是計算機的 “數據高速公路”&#xff0c;負責在內存和其他設備&#xff08;如硬盤、CPU 等&#xff09;之間傳輸數據。它的速度和效率直接影響著計算機系統的整體性能。 你有沒有想過&#xff0c;當你點擊電腦上的一個應用程序&#xff0c;它是…

V4L2攝像頭采集 + WiFi實時傳輸實戰全流程

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry V4L2攝像頭采集 WiFi實時傳輸實戰全流程 1. 實戰場景概述 目標&#xff1a; 嵌入式設備&#xff08;如RK3588/正點原子開發…

Java 之 設計模式

1.單例模式1. ??餓漢式&#xff08;Eager Initialization&#xff09;????核心原理??&#xff1a;類加載時立即創建實例&#xff0c;通過靜態變量直接初始化。??代碼示例??&#xff1a;public class Singleton {private static final Singleton INSTANCE new Sing…

[激光原理與應用-185]:光學器件 - BBO、LBO、CLBO晶體的全面比較

一、相同點非線性光學晶體屬性BBO、LBO、CLBO均為非中心對稱晶體&#xff0c;具備非線性光學效應&#xff0c;廣泛應用于激光頻率轉換&#xff08;如倍頻、三倍頻、和頻、差頻&#xff09;、光學參量振蕩&#xff08;OPO&#xff09;及電光調制等領域。寬透光范圍三者均覆蓋紫外…

Android APN加載耗時優化可行性分析

背景 根據Android系統底層機制和行業實踐,本文討論 APN 加載耗時從4.2s降至0.8s的數據合理性和技術可行性,需結合具體優化手段和硬件環境綜合分析。 以下是關鍵判斷依據及行業參考: ?? 一、APN加載耗時基準參考 未優化場景的典型耗時 首次開機或重置后:APN需從apns-con…

mysql進階-sql調優

概述優化索引在MySQL初階的課程中已經介紹了索引&#xff0c;我們知道InnoDB存儲引擎使?B樹作為索引默認的數據結構來組織數據&#xff0c;為頻繁查詢的列建?索引可以有效的提升查詢效率&#xff0c;那么如何利?索引編寫出?效的SQL查詢語句&#xff1f;以及如何分析某個查詢…

海量數據處理問題詳解

1.從a&#xff0c;b兩個文件各存放50億個url&#xff08;每個url大小為64B&#xff09;&#xff0c;如何在內存為4G中查找a&#xff0c;b中相同的url 計算各文件存放大小&#xff1a;50億*64B 大約為320G&#xff0c;而內存只有4G&#xff0c;顯然存放不下&#xff0c;此時我們…

AI 記憶管理系統:工程實現設計方案

本文檔為《從“健忘”到“懂我”&#xff1a;構建新一代AI記憶系統》中所述理念的詳細工程實現方案。它將聚焦于技術選型、模塊設計、數據流轉和核心算法&#xff0c;為開發團隊提供清晰的落地指引。 1. 系統架構與技術選型 為實現分層記憶與讀寫分離的設計理念&#xff0c;我們…

Linux驅動學習day26天(RS485)

一、原理通過芯片將232信號轉換成485信號&#xff0c;485表示0和1的方法&#xff1a;Va - Vb 的電壓差在2~6V時表示1&#xff0c;Va - Vb 的電壓差在-2~-6V時表示0。這樣傳輸不容易受到干擾&#xff0c;并且傳輸距離長。我們需要做的事情就是發送&#xff1a;使能DE(driver ena…

從零構建TransformerP1-了解設計

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 有很多很多不足的地方&#xff0c;歡迎評論交流&#xff0c;感謝您的閱讀和評論&#x1f604;。 目錄引言1 概念回顧1.1 序列任務1.1.1 將序列變成模型…

JVM 終止機制詳解:用戶線程與守護線程

用戶線程未執行完是否會阻止 JVM 終止&#xff1f;答案是&#xff1a;取決于線程類型。讓我詳細解釋&#xff1a; 核心規則 #mermaid-svg-bg5xpyMAeRWNGGk2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bg5xpyMAe…

Linux Vim 常用快捷鍵

Vim中最常用的快捷鍵&#xff0c;熟練掌握它們可以大大提高編輯效率。移動光標h- 左移j- 下移k- 上移l- 右移w- 移動到下一個單詞開頭b- 移動到上一個單詞開頭e- 移動到單詞末尾0- 移動到行首$- 移動到行尾gg- 移動到文件開頭G- 移動到文件末尾:n- 跳轉到第n行插入模式i- 在光標…

【Bellman負環】Cycle Finding

題目翻譯給定一個有向圖&#xff0c;你的任務是判斷它是否包含負環&#xff0c;并給出這樣一個環的示例。輸入 第一行輸入兩個整數 n 和 m&#xff1a;分別表示節點數和邊數。節點編號為 1, 2, ..., n。 接下來 m 行描述邊&#xff0c;每行有三個整數 a, b, c&#xff1a;表示存…

數據結構(六):樹與二叉樹

一、樹的基本概念樹的定義樹&#xff08;Tree&#xff09;是由 n&#xff08;n ≥ 0&#xff09;個節點組成的有限集合&#xff0c;當 n 0 時稱為空樹。非空樹中&#xff1a;有且僅有一個根節點&#xff08;Root&#xff09;&#xff1b;其余節點可以劃分為若干個互不相交的子…

《Linux運維總結:Shell 腳本日志輸出工具》

總結&#xff1a;整理不易&#xff0c;如果對你有幫助&#xff0c;可否點贊關注一下&#xff1f; 更多詳細內容請參考&#xff1a;Linux運維實戰總結 一、Shell 腳本日志輸出工具 1、提供的 logger() 函數是一個非常實用的 Shell 腳本日志輸出工具&#xff0c;它支持帶時間戳和…

select ... for update阻塞

總結阻塞規則&#xff1a;當前事務持有的鎖 (來自 SELECT ... FOR UPDATE)其他事務嘗試的操作是否會被阻塞&#xff1f;原因排他鎖 (X Lock) 在行 R 上SELECT ... FROM ... (普通查詢)否讀快照 (MVCC)&#xff0c;不需要鎖排他鎖 (X Lock) 在行 R 上SELECT ... FROM ... FOR UP…

LangChain4j終極指南:Spring Boot構建企業級Agent框架

LangChain4j Spring Boot 構建企業級 Agent 框架深度指南&#xff08;3000字終極版&#xff09;一、架構設計&#xff1a;面向未來的企業級智能體系統1.1 分層架構設計1.2 核心組件職責1.3 企業級特性設計二、核心模塊深度實現2.1 智能體協作引擎&#xff08;LangGraph4j高級應…

前端基礎之《Vue(29)—Vue3 路由V4》

一、安裝1、命令cnpm install vue-router42、配置映射為src路徑&#xff08;1&#xff09;安裝對應配置cnpm install types/node&#xff08;2&#xff09;配置vite.config.tsimport { defineConfig } from vite import vue from vitejs/plugin-vue import * as path from &quo…

9.2 通過DuEDrawingControl把eDrawing嵌入到C#中顯示

本文介紹如何通過DuEDrawingControl控件在C#的WPF中進行3D的顯示。 DuEDrawingControl在實際應用中可以應用于以下場景: 1.CAD文件預覽:在Winform或WPF應用程序中,用戶可以預覽裝配文件、工程圖文件等,方便進行設計和審核。 2.打印管理:控件支持打印文件的管理,用…