Spring Boot 中 Properties 與 YAML 的深度解析與最佳實(shí)踐記錄(告別配置混亂)
一、Spring配置文件
1.1、什么是Spring配置
Spring配置指的是在Spring框架中定義和管理應(yīng)用程序組件(如Bean)及其依賴關(guān)系的過程
作用:
配置文件主要用于解決硬編碼問題,它將可能變更的信息集中存放。程序啟動時,會從配置文件中讀取數(shù)據(jù)并加載運(yùn)行。
1.2、Spring Boot 配置信息
SpringBoot不僅支持多種配置文件格式,還通過標(biāo)準(zhǔn)化配置規(guī)范來促進(jìn)其他框架與SpringBoot的集成,常見的配置信息包括:
- 項(xiàng)目啟動端口
- 數(shù)據(jù)庫連接信息(含用戶名和密碼)
- 第三方系統(tǒng)調(diào)用密鑰
- 用于問題排查的常規(guī)日志和異常日志
項(xiàng)目啟動端口配置SpringBoot 內(nèi)置Tomcat 服務(wù)器,默認(rèn)使用8080端口??紤]到該端口可能被其他應(yīng)用占用,SpringBoot 支持用戶自定義端口配置
數(shù)據(jù)庫連接配置
為簡化數(shù)據(jù)庫訪問,各種持久層框架對JDBC進(jìn)行了深度封裝,使用戶僅需少量代碼即可完成數(shù)據(jù)庫操作。由于不同應(yīng)用需要連接不同數(shù)據(jù)庫,這些框架都支持用戶自定義數(shù)據(jù)庫連接配置
1.3、Spring Boot支持的配置文件
Spring Boot支持的配置文件有以下幾種:
(1)Properties文件:使用 properties 作為文件后綴,采用鍵值對的方式進(jìn)行配置。示例:application
.properties(2)YAML文件:使用
.yml 或 yaml 作為文件后綴,采用縮進(jìn)和冒號來表示結(jié)構(gòu),支持列表和嵌套結(jié)構(gòu),具有更易讀的特點(diǎn)。示例:application.yml(3) XML文件:使用
.xml作為文件后綴,采用XML標(biāo)簽的形式進(jìn)行配置。可以與Spring Framework的傳統(tǒng)配置方式兼容。示例:application.xml(4) JSON文件:使用 json 作為文件后綴,采用JSON格式進(jìn)行配置。示例:application
.json
Spring Boot默認(rèn)使用 src/main/resources 目錄下的 application.properties 或 application.yml 作為配置文件。開發(fā)者可根據(jù)項(xiàng)目需求選擇其中一種格式,按照對應(yīng)語法規(guī)則進(jìn)行配置即可


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

修改 application.yml 文件:

再次運(yùn)行程序,我們可以看到Tomcat啟動端口號為:9090

1.4、配置文件沖突
當(dāng)一個項(xiàng)目中既存在 Properties文件,又存在 YAML文件時,并且配置信息有沖突如下:

答案是:

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

二、Properties配置文件
properties 是早期常用的配置文件格式,也是 SpringBoot 項(xiàng)目默認(rèn)的配置文件類型
2.1、Properties基本語法
properties采用鍵值對形式配置,鍵(key)和值(value)之間通過等號 "=" 連接,使用 ‘#’ 來添加注釋,例如:

詳細(xì)語法講解請看官方文檔:Spring boot配置
2.2、讀取配置文件
在配置文件中添加如下內(nèi)容:

@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缺點(diǎn)分析
2.3.1、擴(kuò)展性有限
Properties文件采用簡單的鍵值對結(jié)構(gòu),僅支持單層數(shù)據(jù),無法直接表達(dá)復(fù)雜嵌套結(jié)構(gòu)(如JSON/XML支持的樹形數(shù)據(jù))。當(dāng)配置項(xiàng)存在層級關(guān)系時,需依賴命名約定(如phone.people1.num),可讀性和維護(hù)性較差
2.3.2、類型支持不足
所有值均以字符串形式存儲,需手動轉(zhuǎn)換數(shù)據(jù)類型。例如數(shù)字、布爾值等需額外代碼處理,易引發(fā)類型轉(zhuǎn)換錯誤或遺漏
2.3.3、信息冗余
properties 配置是以key-value的形式配置的,會有很多的冗余的信息,如下:

三、YAML配置文件
yaml 通常簡寫為 yml,這是實(shí)際開發(fā)中最常見的寫法。yml 和 yaml 的使用方式完全一致。
3.1、yml基本語法
YML 采用樹形結(jié)構(gòu)的配置文件格式,其基本語法規(guī)則為 "key: value" ;其中 key 和 value 之間必須使用英文冒號加空格分隔,該空格不可省略?;菊Z法示例如下:

3.2、yml配置不同數(shù)據(jù)類型
3.2.1、正常接收參數(shù)
上述代碼中,空字符串可以空著不寫,但是為了避免造成誤會,我們可以加上引號表示空字符串,此處單引號或者雙引號都一樣
yml 讀取配置的方式與 properties 相同,使用 @Value 注解即可,具體實(shí)現(xiàn)代碼如下:

訪問URL后:

3.2.2、不同類型接收參數(shù)
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {
@Value("${float.value}")
private int value;
@PostConstruct
public void getList(){
System.out.println("嘗試整形接收浮點(diǎn)型變量:"+value);
}
}在使用 int 類型接收 yml 配置文件中 float.value 的值時,會出現(xiàn)類型匹配異常。因此,在接收參數(shù)時需要注意將參數(shù)轉(zhuǎn)換為兼容的數(shù)據(jù)類型

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

此時無法通過@Value 注解讀取配置對象,需要使用 @ConfigurationProperties 注解來實(shí)現(xiàn),具體代碼如下:
@ConfigurationProperties(prefix = "hero")
@Component
@Data
public class Hero {
private String name;
private int age;
private String hobby;
}@RestController
@RequestMapping("Demo")
public class PropertiesDemo {
@Autowired
private Hero hero;
@RequestMapping("hero")
public String getHero(){
return hero.toString();
}
}運(yùn)行程序并訪問URL:127.0.0.1:8080/Demo/hero 后得:

@ConfigurationProperties 注解會將配置文件中以"hero"為前綴的配置項(xiàng)自動映射到 Hero 類的對應(yīng)屬性上。隨后,Spring 會將這些值注入到 PropertiesDemo 類的 Hero 對象中,從而得到上述最終的配置結(jié)果,當(dāng)然上述配置文件中的對象也可看作為一個一個的參數(shù)按照 3.2.1 目錄的方法步驟進(jìn)行獲取
3.4、配置集合
yml 配置文件也可以配置 list 集合,代碼如下:
list:
name:
- aaa
- bbb
- ccc
- ddd
- eee集合的讀取方式與對象相同,都是通過 @ConfigurationProperties注解來實(shí)現(xiàn)的

@RestController
@RequestMapping("Demo")
public class PropertiesDemo {
@Autowired
private ListConfig listConfig;
@PostConstruct
public void getList(){
System.out.println(listConfig.toString());
}
}觀察結(jié)果:

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

3.5、配置Map
yml 配置文件還可以配置 Map,代碼如下:
maptypes:
map:
k1: v1
k2: v2
k3: v3Map的讀取方式與上述對象和集合也相同,也是通過 @ConfigurationProperties 注解來實(shí)現(xiàn)的
@Data
@ConfigurationProperties("maptypes")
@Component
public class MapConfig {
private HashMap<String,String> map;
}
------------------------------------------
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {
@Autowired
private MapConfig mapConfig;
@PostConstruct
public void getList(){
System.out.println(mapConfig.toString());
}
}觀察結(jié)果:

3.6、yml的優(yōu)缺點(diǎn)
3.6.1、優(yōu)點(diǎn)
(1)語法簡潔明了,可讀性強(qiáng),寫法簡單,易于理解
(2)數(shù)據(jù)類型支持豐富,能直觀地表達(dá)對象、數(shù)組、集合等多種數(shù)據(jù)結(jié)構(gòu)
(3)跨語言兼容性好,不僅適用于Java,還支持Golang、Python、Ruby、JavaScript等多種編程語言
3.6.2、缺點(diǎn)
(1)不適合編寫復(fù)雜配置文件
(2)格式要求嚴(yán)格,細(xì)小的空格或縮進(jìn)錯誤都可能導(dǎo)致解析失敗
四、本章總結(jié)
properties 文件采用 key=value 的鍵值對格式配置,而 yml 文件則采用樹形結(jié)構(gòu)配置方式
讀取配置文件時,可使用 @Value 注解,注解內(nèi)需以 "${}" 的格式指定配置項(xiàng)
yml 文件通過換行縮進(jìn)來表示層級關(guān)系,key 和 value 之間需用英文冒號加空格分隔,且空格不可省略
properties 是早期默認(rèn)的配置文件格式,存在一定數(shù)據(jù)冗余問題,yml 能有效解決冗余問題,但不太適合復(fù)雜配置場景
yml 和 properties 可以共存于同一項(xiàng)目,但建議統(tǒng)一使用其中一種配置文件類型
到此這篇關(guān)于Spring Boot 中 Properties 與 YAML 的深度解析與最佳實(shí)踐記錄(告別配置混亂)的文章就介紹到這了,更多相關(guān)Spring Boot Properties 與 YAML內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot啟動異常Exception in thread “main“ 
本文主要介紹了SpringBoot啟動異常Exception in thread “main“ java.lang.UnsupportedClassVersionError,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
教你用Springboot實(shí)現(xiàn)攔截器獲取header內(nèi)容
項(xiàng)目中遇到一個需求,對接上游系統(tǒng)是涉及到需要增加請求頭,請求頭的信息是動態(tài)獲取的,需要動態(tài)從下游拿到之后轉(zhuǎn)給上游,文中非常詳細(xì)的介紹了該需求的實(shí)現(xiàn),需要的朋友可以參考下2021-05-05
使用Spring Data JPA的坑點(diǎn)記錄總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于使用Spring Data JPA的一些坑點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Idea創(chuàng)建springboot不能選擇java8的解決
在IDEA 2023版本創(chuàng)建Spring Boot項(xiàng)目時,發(fā)現(xiàn)沒有Java 8選項(xiàng),只有Java 17和Java 20,解決方法包括:通過修改服務(wù)器URL(推薦)或直接在創(chuàng)建后修改pom.xml文件中的Spring Boot和Java版本2025-01-01
關(guān)于訪問后端接口報404錯誤問題的解決方法(全網(wǎng)最細(xì)!)
404頁面的出現(xiàn)會降低用戶體驗(yàn),那么導(dǎo)致404頁面出現(xiàn)的原因是什么呢?這篇文章主要給大家介紹了關(guān)于訪問后端接口報404錯誤問題的解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
解決BigDecimal轉(zhuǎn)long丟失精度的問題
這篇文章主要介紹了解決BigDecimal轉(zhuǎn)long丟失精度的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

