告別配置混亂!Spring Boot 中 Properties 與 YAML 的深度解析與最佳實踐

一、Spring配置文件

1.1、什么是Spring配置

????????Spring配置指的是在Spring框架中定義和管理應用程序組件(如Bean)及其依賴關系的過程

作用

????????配置文件主要用于解決硬編碼問題,它將可能變更的信息集中存放。程序啟動時,會從配置文件中讀取數據并加載運行

1.2、Spring Boot 配置信息

????????SpringBoot不僅支持多種配置文件格式,還通過標準化配置規范來促進其他框架與SpringBoot的集成,常見的配置信息包括:

  • 項目啟動端口
  • 數據庫連接信息(含用戶名和密碼)
  • 第三方系統調用密鑰
  • 用于問題排查的常規日志和異常日志

項目啟動端口配置

????????SpringBoot 內置Tomcat 服務器,默認使用8080端口。考慮到該端口可能被其他應用占用,SpringBoot 支持用戶自定義端口配置


數據庫連接配置

????????為簡化數據庫訪問,各種持久層框架對JDBC進行了深度封裝,使用戶僅需少量代碼即可完成數據庫操作。由于不同應用需要連接不同數據庫,這些框架都支持用戶自定義數據庫連接配置

1.3、Spring Boot支持的配置文件

Spring Boot支持的配置文件有以下幾種:

? ? ? ? (1)Properties文件:使用 properties 作為文件后綴,采用鍵值對的方式進行配置。示例:application.properties

????????(2)YAML文件:使用.yml 或 yaml 作為文件后綴,采用縮進和冒號來表示結構,支持列表和嵌套結構,具有更易讀的特點。示例:application.yml

????????(3) XML文件:使用.xml作為文件后綴,采用XML標簽的形式進行配置。可以與Spring Framework的傳統配置方式兼容。示例:application.xml

????????(4) JSON文件:使用 json 作為文件后綴,采用JSON格式進行配置。示例:application.json

????????Spring Boot默認使用?src/main/resources?目錄下的 application.propertiesapplication.yml 作為配置文件。開發者可根據項目需求選擇其中一種格式,按照對應語法規則進行配置即可

?????????此配置文件類型為YAML文件,前篇我們講過:

?????????修改 application.yml 文件:

????????再次運行程序,我們可以看到Tomcat啟動端口號為:9090

1.4、配置文件沖突

?????????當一個項目中既存在 Properties文件,又存在 YAML文件時,并且配置信息有沖突如下:

?????????答案是

????????我們再看運行結果:?Tomcat 啟動端口號為:8776,即為?properties文件中配置的端口號,但是我們在項目配置信息時,盡量只生成一個配置文件,避免因沖突造成的故障

二、Properties配置文件

????????properties 是早期常用的配置文件格式,也是 SpringBoot 項目默認的配置文件類型

?2.1、Properties基本語法

????????properties采用鍵值對形式配置,鍵(key)和值(value)之間通過等號 "=" 連接,使用 ‘#’ 來添加注釋,例如:

????????詳細語法講解請看官方文檔:? ? ? ?Spring boot配置

2.2、讀取配置文件

????????在配置文件中添加如下內容:

@RestController
@RequestMapping("Demo")
public class PropertiesDemo {@Value("${phone.num}")private int num;@RequestMapping("a")public String a(){System.out.println(num);return "讀取到電話號碼: "+num;}
}

????????訪問URL路徑?127.0.0.1:9090/Demo/a?后:

2.3、Properties缺點分析

2.3.1、擴展性有限

????????Properties文件采用簡單的鍵值對結構,僅支持單層數據,無法直接表達復雜嵌套結構(如JSON/XML支持的樹形數據)。當配置項存在層級關系時,需依賴命名約定(如phone.people1.num),可讀性和維護性較差

2.3.2、類型支持不足

????????所有值均以字符串形式存儲,需手動轉換數據類型。例如數字、布爾值等需額外代碼處理,易引發類型轉換錯誤或遺漏

2.3.3、信息冗余

????????properties?配置是以key-value的形式配置的,會有很多的冗余的信息,如下:

三、YAML配置文件

????????yaml 通常簡寫為 yml,這是實際開發中最常見的寫法。yml 和 yaml 的使用方式完全一致。

3.1、yml基本語法

????????YML 采用樹形結構的配置文件格式,其基本語法規則為 "key: value" ;其中 key 和 value 之間必須使用英文冒號加空格分隔,該空格不可省略。基本語法示例如下:

?3.2、yml配置不同數據類型

3.2.1、正常接收參數

????????上述代碼中,空字符串可以空著不寫,但是為了避免造成誤會,我們可以加上引號表示空字符串,此處單引號或者雙引號都一樣?

????????yml 讀取配置的方式與 properties 相同,使用 @Value 注解即可,具體實現代碼如下:

?????????訪問URL后:

?3.2.2、不同類型接收參數
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {@Value("${float.value}")private int value;@PostConstructpublic void getList(){System.out.println("嘗試整形接收浮點型變量:"+value);}
}

????????在使用?int?類型接收?yml?配置文件中 float.value 的值時,會出現類型匹配異常。因此,在接收參數時需要注意將參數轉換為兼容的數據類型

?3.3、配置對象

????????我們還可以在yml中配置對象,如下:

????????此時無法通過@Value?注解讀取配置對象,需要使用 @ConfigurationProperties 注解來實現,具體代碼如下:

@ConfigurationProperties(prefix = "hero")
@Component
@Data
public class Hero {private String name;private int age;private String hobby;
}
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {@Autowiredprivate Hero hero;@RequestMapping("hero")public String getHero(){return hero.toString();}
}

????????運行程序并訪問URL:127.0.0.1:8080/Demo/hero?后得:

????????@ConfigurationProperties 注解會將配置文件中以"hero"為前綴的配置項自動映射到 Hero 類的對應屬性上。隨后,Spring 會將這些值注入到 PropertiesDemo 類的 Hero 對象中,從而得到上述最終的配置結果,當然上述配置文件中的對象也可看作為一個一個的參數按照 3.2.1 目錄的方法步驟進行獲取

3.4、配置集合

?????????yml?配置文件也可以配置 list 集合,代碼如下:

list:name:- aaa- bbb- ccc- ddd- eee

????????集合的讀取方式與對象相同,都是通過 @ConfigurationProperties注解來實現的

@RestController
@RequestMapping("Demo")
public class PropertiesDemo {@Autowiredprivate ListConfig listConfig;@PostConstructpublic void getList(){System.out.println(listConfig.toString());}
}

????????觀察結果:

????????此處我們可以觀察到,在輸出 list 集合后,?此程序還未啟動完成,為什么呢?

?3.5、配置Map

??yml?配置文件還可以配置 Map,代碼如下:

maptypes:map:k1: v1k2: v2k3: v3

????????Map的讀取方式與上述對象和集合也相同,也是通過 @ConfigurationProperties?注解來實現的

@Data
@ConfigurationProperties("maptypes")
@Component
public class MapConfig {private HashMap<String,String> map;
}
------------------------------------------
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {@Autowiredprivate MapConfig mapConfig;@PostConstructpublic void getList(){System.out.println(mapConfig.toString());}
}

?????????觀察結果:

3.6、yml的優缺點?

3.6.1、優點

????????(1)語法簡潔明了,可讀性強,寫法簡單,易于理解

????????(2)數據類型支持豐富,能直觀地表達對象、數組、集合等多種數據結構

????????(3)跨語言兼容性好,不僅適用于Java,還支持Golang、Python、Ruby、JavaScript等多種編程語言

3.6.2、缺點

????????(1)不適合編寫復雜配置文件

????????(2)格式要求嚴格,細小的空格或縮進錯誤都可能導致解析失敗

四、本章總結

????????properties 文件采用 key=value 的鍵值對格式配置,而 yml 文件則采用樹形結構配置方式

????????讀取配置文件時,可使用 @Value 注解,注解內需以 "${}" 的格式指定配置項

????????yml 文件通過換行縮進來表示層級關系,key 和 value 之間需用英文冒號加空格分隔,且空格不可省略

????????properties 是早期默認的配置文件格式,存在一定數據冗余問題,yml 能有效解決冗余問題,但不太適合復雜配置場景

????????yml 和 properties 可以共存于同一項目,但建議統一使用其中一種配置文件類型

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

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

相關文章

無人機噴灑系統技術要點與難點解析

一、 模塊運行方式1. 任務規劃與加載模塊&#xff1a;輸入&#xff1a;農田邊界、障礙物信息、作物類型、病蟲害信息、所需噴灑量、天氣條件。運行&#xff1a;利用地面站軟件或移動APP&#xff0c;規劃最優飛行路徑&#xff0c;設定飛行高度、速度、噴灑參數、作業區域。將規…

mongodb源代碼分析createCollection命令創建Collection流程分析

MongoDB 提供兩種方式創建集合&#xff1a;隱式創建 和 顯式創建。方式 1&#xff1a;隱式創建&#xff08;推薦&#xff09;當你向不存在的集合中插入文檔時&#xff0c;MongoDB 會自動創建該集合。示例在 db中隱式創建 users 集合&#xff1a;javascriptdb.users.insertOne({…

c++注意點(13)----設計模式(抽象工廠)

創建型模式抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09;是一種創建型設計模式&#xff0c;它提供一個接口&#xff0c;用于創建一系列相關或相互依賴的對象&#xff0c;而無需指定它們具體的類。簡單說&#xff0c;它就像一個 "超級工廠"&#xff…

【大語言模型入門】—— Transformer 如何工作:Transformer 架構的詳細探索

Transformer 如何工作&#xff1a;Transformer 架構的詳細探索Transformer 如何工作&#xff1a;Transformer 架構的詳細探索什么是 Transformer&#xff1f;什么是 Transformer 模型&#xff1f;歷史背景從 RNN 模型&#xff08;如 LSTM&#xff09;到 Transformer 模型在 NLP…

iOS安全和逆向系列教程 第20篇:Objective-C運行時機制深度解析與Hook技術

iOS安全和逆向系列教程 第20篇:Objective-C運行時機制深度解析與Hook技術 引言 在上一篇文章中,我們深入學習了ARM64匯編語言的基礎知識,掌握了從寄存器操作到指令分析的完整技能體系。現在,我們將把這些底層知識與iOS應用的高層邏輯聯系起來,深入探討Objective-C運行時…

IDEA中全局搜索快捷鍵Ctrl+Shift+F為何失靈?探尋原因與修復指南

在軟件開發中&#xff0c;高效地查找和管理代碼是提升生產力的關鍵。IntelliJ IDEA&#xff0c;作為一款功能強大的集成開發環境&#xff08;IDE&#xff09;&#xff0c;提供了豐富的搜索功能&#xff0c;幫助開發者迅速定位代碼、資源、甚至是IDE功能本身。 在 IntelliJ IDE…

【學習筆記】Lean4 定理證明 ing

文章目錄概述Lean4 定理證明初探示例&#xff1a;證明 1 1 2示例&#xff1a;證明 2 * (x y) 2 * x 2 * yLean4 定理證明基礎命題與定理命題&#xff08;Proposition&#xff09;定理&#xff08;Theorem&#xff09;量詞策略概述 Lean證明是指在Lean環境中&#xff0c;通…

墨者:SQL注入漏洞測試(HTTP頭注入)

墨者學院&#xff1a;SQL注入漏洞測試(HTTP頭注入)&#x1f680; 1. 什么是HTTP頭注入&#xff1f;&#x1f50d; HTTP頭注入是指攻擊者通過篡改HTTP請求頭部的字段&#xff08;如User-Agent、Referer、Cookie、Host等&#xff09;&#xff0c;將惡意SQL代碼插入到后端數據庫查…

linux_前臺,后臺進程

*在用戶訪問端口時&#xff0c;操作系統會形成對應的session,在其的內部進一步形成bash等進程 *一個會話只有一個前臺進程&#xff0c;可以有多個后臺進程&#xff0c;前臺與后臺進程的區別在于誰擁有鍵盤的使用權*前臺與后臺進程都可以訪問顯示器但是后臺無法訪問標準輸入獲取…

spring data mongodb 入門使用手冊

<!--pom.xml引入依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>文檔映射類Student.java import lombok.Data; import lombok.NoArgsCons…

Fastjson2常用操作大全:對象、字符串、集合、數組、Map與JSON互轉實戰

高性能&#xff1a; 核心解析器和生成器經過深度優化&#xff0c;性能遠超許多同類庫。 功能豐富&#xff1a; 支持標準JSON、JSONPath查詢、泛型處理、日期格式化、自定義序列化/反序列化等。 易用性&#xff1a; API 設計簡潔直觀&#xff0c;JSON 工具類提供了最常用的 toJS…

大模型——字節Coze重磅開源!Dify何去何從

大模型——字節Coze重磅開源!Dify何去何從 想必很多人盼了很久,就在昨晚,字節Coze終于開源了!Coze Studio 是字節跳動新一代 AI Agent 開發平臺扣子(Coze)的開源版本。 提供 AI Agent 開發所需的全部核心技術:Prompt、RAG、Plugin、Workflow,使得開發者可以聚焦創造 A…

NaVid——基于單目RGB捕獲的視頻讓VLM規劃「連續環境中VLN」的下一步:無需地圖/里程計/深度信息(含MP3D/R2R/RxR,及VLN-CE的詳解)

前言 因為我司「七月在線」準備于25年7月底復現下NaVILA&#xff0c;而在研究NaVILA的過程中&#xff0c;注意到了這個NaVid 雖然NaVid目前已經不是VLN sota了&#xff0c;但其首次展示了VLM在無需地圖、里程計或深度輸入的情況下&#xff0c;能夠實現優秀的導航性能且對后來…

【Vue2】結合chrome與element-ui的網頁端條碼打印

所有文章都是免費查看的&#xff0c;如果有無法查看的情況&#xff0c;煩請聯系我修改哈~ 序言 為什么要做這個呢&#xff1f;因為所需要的條碼打印功能比較簡單&#xff0c;符合需要即可&#xff0c;但是呢網上查看了發現并沒有合適的開源項&#xff0c;其他成熟的軟件收費又超…

循環神經網絡——動手學深度學習7

環境&#xff1a;PyCharm python3.8 &#x1f449;【循環神經網絡】(recurrent neural network&#xff0c;RNN) RNN通過 引入狀態變量存儲過去的信息和當前的輸入&#xff0c;從而可以確定當前的輸出。狀態變量捕捉序列的時序依賴&#xff0c;是處理文本、時間序列等數據的…

Java面試寶典:MySQL8新特性底層原理

一、降序索引的革新 1.1 降序索引的核心概念 MySQL 8.0 實現了真正的降序索引(Descending Index) 支持,這是數據庫引擎層面的重大改進: 存儲引擎支持:僅 InnoDB 存儲引擎支持降序索引,且僅適用于 B+Tree 索引結構 語法顯式聲明:通過 DESC 關鍵字顯式指定字段的排序方向…

前端-html+CSS基礎到高級(三)html基礎和開發工具

一、html語法規范什么是注釋?在同學上課學習時&#xff0c;我們會在書本段落間記錄內容的注解&#xff0c;方便下次看到此處理解。問題&#xff1a;我們在書本段落間記錄下的注解是為了給誰看的&#xff1f; 下次的閱讀課本者&#xff08;自己&#xff09;。程序員在寫代碼時也…

-Dspring.output.ansi.enabled=ALWAYS 設置彩色日志不生效

-Dspring.output.ansi.enabledALWAYS 設置彩色日志不生效 問題原因&#xff1a;使用的自定義的 logback-spring.xml日志需要改一下 <?xml version"1.0" encoding"UTF-8"?> <configuration><appender name"STDOUT" class"c…

C# 判斷語句深度解析

C# 判斷語句深度解析 引言 在編程領域,C# 是一種廣泛使用的面向對象的編程語言,常用于構建各種應用程序,從桌面到移動應用,再到網站服務。C# 的核心特性之一是其強大的控制流機制,其中包括條件判斷。本文將深入探討 C# 中的判斷語句,包括它們的類型、使用場景以及最佳實…

Ambari 3.0.0 全網首發支持 Ubuntu 22!

本月我們團隊帶來了一個重磅進展&#xff1a;Ambari 3.0.0 全網首發支持 Ubuntu 22&#xff01; 經過數月籌備和持續迭代&#xff0c;終于讓 Ambari 以及大數據基礎組件可以順利運行在 Ubuntu 22 上。 需求來源&#xff1a;用戶呼聲決定研發方向 年初有位小伙伴私信我們&#x…