一、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.properties 或 application.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 可以共存于同一項目,但建議統一使用其中一種配置文件類型