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


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

修改 application.yml 文件:

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

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

答案是:

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

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

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

三、YAML配置文件
yaml 通常簡寫為 yml,這是實際開發(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 注解即可,具體實現(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("嘗試整形接收浮點型變量:"+value);
}
}在使用 int 類型接收 yml 配置文件中 float.value 的值時,會出現(xiàn)類型匹配異常。因此,在接收參數(shù)時需要注意將參數(shù)轉(zhuǎn)換為兼容的數(shù)據(jù)類型

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

此時無法通過@Value 注解讀取配置對象,需要使用 @ConfigurationProperties 注解來實現(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();
}
}運行程序并訪問URL:127.0.0.1:8080/Demo/hero 后得:

@ConfigurationProperties 注解會將配置文件中以"hero"為前綴的配置項自動映射到 Hero 類的對應(yīng)屬性上。隨后,Spring 會將這些值注入到 PropertiesDemo 類的 Hero 對象中,從而得到上述最終的配置結(jié)果,當(dāng)然上述配置文件中的對象也可看作為一個一個的參數(shù)按照 3.2.1 目錄的方法步驟進行獲取
3.4、配置集合
yml 配置文件也可以配置 list 集合,代碼如下:
list:
name:
- aaa
- bbb
- ccc
- ddd
- eee集合的讀取方式與對象相同,都是通過 @ConfigurationProperties注解來實現(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 注解來實現(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)缺點
3.6.1、優(yōu)點
(1)語法簡潔明了,可讀性強,寫法簡單,易于理解
(2)數(shù)據(jù)類型支持豐富,能直觀地表達對象、數(shù)組、集合等多種數(shù)據(jù)結(jié)構(gòu)
(3)跨語言兼容性好,不僅適用于Java,還支持Golang、Python、Ruby、JavaScript等多種編程語言
3.6.2、缺點
(1)不適合編寫復(fù)雜配置文件
(2)格式要求嚴格,細小的空格或縮進錯誤都可能導(dǎo)致解析失敗
四、本章總結(jié)
properties 文件采用 key=value 的鍵值對格式配置,而 yml 文件則采用樹形結(jié)構(gòu)配置方式
讀取配置文件時,可使用 @Value 注解,注解內(nèi)需以 "${}" 的格式指定配置項
yml 文件通過換行縮進來表示層級關(guān)系,key 和 value 之間需用英文冒號加空格分隔,且空格不可省略
properties 是早期默認的配置文件格式,存在一定數(shù)據(jù)冗余問題,yml 能有效解決冗余問題,但不太適合復(fù)雜配置場景
yml 和 properties 可以共存于同一項目,但建議統(tǒng)一使用其中一種配置文件類型
到此這篇關(guān)于Spring Boot 中 Properties 與 YAML 的深度解析與最佳實踐記錄(告別配置混亂)的文章就介紹到這了,更多相關(guān)Spring Boot Properties 與 YAML內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
多用多學(xué)之Java中的Set,List,Map詳解
下面小編就為大家?guī)硪黄嘤枚鄬W(xué)之Java中的Set,List,Map詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
Spring中的@PropertySource注解源碼詳細解析
這篇文章主要介紹了Spring中的@PropertySource注解源碼詳細解析,@PropertySource注解,標(biāo)注在配置類@Configuration上面,下面主要分析一下@PropertySource注解的處理過程,也就是怎么把配置信息從.properies文件放到environment中的,需要的朋友可以參考下2024-01-01
SpringCloud使用Kafka Streams實現(xiàn)實時數(shù)據(jù)處理
使用Kafka Streams在Spring Cloud中實現(xiàn)實時數(shù)據(jù)處理可以幫助我們構(gòu)建可擴展、高性能的實時數(shù)據(jù)處理應(yīng)用,Kafka Streams是一個基于Kafka的流處理庫,本文介紹了如何在SpringCloud中使用Kafka Streams實現(xiàn)實時數(shù)據(jù)處理,需要的朋友可以參考下2024-07-07
Java中將MultipartFile和File互轉(zhuǎn)的方法詳解
我們在開發(fā)過程中經(jīng)常需要接收前端傳來的文件,通常需要處理MultipartFile格式的文件,今天來介紹一下MultipartFile和File怎么進行優(yōu)雅的互轉(zhuǎn),需要的朋友可以參考下2023-10-10
Java C++題解leetcode816模糊坐標(biāo)示例
這篇文章主要為大家介紹了Java C++題解leetcode816模糊坐標(biāo)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
深入學(xué)習(xí)JAVA GC日志的相關(guān)知識
JVM 在Java應(yīng)用程序優(yōu)化中是不可缺少的一大重項,如何合理配置Java參數(shù),如何驗證配置參數(shù)的有效性,從GC日志中可以獲得很重要的提示。下面小編就帶大家來一起學(xué)習(xí)一下吧2019-06-06

