目錄
1.前言
2.正文
2.1配置文件的格式
2.2properties
2.2.1基礎語法
2.2.2value讀取配置文件
2.2.3缺點
2.3yml
2.3.1基礎語法
2.3.2配置不同數據類型
2.3.3配置讀取
2.3.4配置對象和集合
2.3.5優缺點
2.4綜合練習:驗證碼案例
2.4.1分析需求
2.4.2接口
2.4.3介紹hutool
2.4.4代碼實現
2.4.4.1后端實現
2.4.4.2前端核心實現
3.小結
1.前言
哈嘍大家好吖,在Spring Boot項目中,配置文件是連接代碼與環境的橋梁,直接影響著應用的可維護性和擴展性。面對傳統的Properties格式與新興的YAML格式,開發者該如何選擇?它們的語法差異是什么?如何高效讀取復雜配置?本文將從基礎語法、數據類型支持、配置讀取方式、對象/集合映射等維度,深入解析兩種配置文件的特性,并結合實際代碼演示,助你在項目中做出最合理的技術選型!
2.正文
2.1配置文件的格式
在Spring框架中,配置文件是應用程序的重要組成部分,它允許我們將配置信息從代碼中分離出來,實現配置與代碼的松耦合。Spring支持多種配置文件格式,其中最常用的兩種是:
.properties
文件:傳統的鍵值對格式
.yml
或.yaml
文件:基于縮進的層次結構格式
這兩種格式各有優缺點,開發者可以根據項目需求和個人偏好進行選擇。接下來我們將詳細探討這兩種配置格式的特點和使用方法。
2.2properties
2.2.1基礎語法
Properties 文件是 Spring Boot 中最傳統的配置文件格式,采用簡單的?鍵值對(Key-Value)?形式定義配置,語法清晰但靈活性較低。以下是核心語法規則和示例:
鍵值對格式:
每行定義一個配置項,格式為?
key=value
。
key
?是配置項的唯一標識,支持?.
?分隔的層級命名(如?db.url
)。
value
?可以是字符串、數字、布爾值等,默認按字符串處理。# 示例:數據庫配置 db.url=jdbc:mysql://localhost:3306/test db.username=root db.password=123456
注釋:
使用?
#
?或?!
?開頭添加注釋,解釋配置用途:# 服務器端口配置 server.port=8080 ! 開發環境開關 dev.mode=true
特殊字符處理:
若?
value
?包含空格、等號或冒號,需用反斜杠?\
?轉義:error.message=參數\ 不能為空! special.symbol=key\=value
Unicode 字符支持:非 ASCII 字符(如中文)需轉換為 Unicode 編碼:
greeting=\u4F60\u597D(表示“你好”)
2.2.2value讀取配置文件
在 Spring 中,可通過?@Value
?注解或?Environment
?對象直接讀取配置值。
1.@Value 注解
直接在字段上使用?
@Value("${key}")
?注入配置值。支持設置默認值(當配置項不存在時生效):
@Component public class DatabaseConfig {@Value("${db.url:jdbc:mysql://default}") // 默認值private String url;@Value("${db.username}")private String username; }
2.Environment 對象
- 注入?
Environment
?對象,通過?getProperty()
?動態獲取配置:@Autowired private Environment env;public void printConfig() {String password = env.getProperty("db.password");Integer port = env.getProperty("server.port", Integer.class); // 自動類型轉換 }
3.類型轉換
- 非字符串類型(如整數、布爾值)需手動轉換:
@Value("${server.port}") private int port; // Spring 自動轉換為 int 類型@Value("${feature.enabled:false}") // 默認值 false private boolean isEnabled;
2.2.3缺點
盡管 Properties 格式簡單易用,但在復雜項目中存在明顯短板:
1.層級結構缺失
所有配置項平鋪展示,缺乏邏輯分組。
對比示例:
# Properties 格式 user.name=Alice user.age=25 user.address.city=Beijing
# yml 等效配置(結構更清晰) user:name: Aliceage: 25address:city: Beijing
2.重復前綴冗余
相同前綴的配置需重復書寫,導致冗余:
redis.cache.host=127.0.0.1 redis.cache.port=6379 redis.cache.timeout=30
3.復雜類型支持不足
無法直接定義集合或對象,需手動拆分或借助特殊格式:
# 列表需用逗號分隔,代碼中需手動解析 server.ports=8080,8081,8082# 對象需拆分為多個鍵值對 book.title=Spring Guide book.author=John Doe
2.3yml
2.3.1基礎語法
YAL是一種以層級縮進為核心的配置文件格式,語法簡潔且可讀性強。以下是核心規則:
層級結構
使用?空格縮進?表示層級關系(禁止用 Tab 鍵)。
同一層級的元素左對齊,縮進空格數需一致。
server:port: 8080 # 正確:server 下的子層級縮進 2 空格servlet:context-path: /api # servlet 的子層級繼續縮進
鍵值對
鍵與值之間用?
:
?分隔,冒號后必須加?一個空格。字符串默認不加引號,特殊字符(如?
:
、#
)可用雙引號包裹。name: Spring Boot # 普通字符串 version: "3.2.0" # 引號可省略,但推薦明確 message: "Hello:World" # 包含冒號,需用引號
注釋
單行注釋以?
#
?開頭。# 服務器配置 server:port: 8080 # 開發環境端口
多行文本
用?
|
?保留換行符,或用?>
?折疊換行符。description: | # 保留換行This is amulti-linetext.summary: > # 折疊為一行(換行符轉空格)This is a single-line text.
2.3.2配置不同數據類型
YML?自動識別數據類型,無需手動轉換,支持以下常見類型:
字符串
path: /api/v1 # 普通字符串 error: "Error: 404\nPage not found." # 包含冒號和換行符
默認不加引號,特殊字符用雙引號包裹(支持轉義符如?
\n
)。數值
int: 100 float: 3.14 scientific: 6.022e23 # 科學計數法
整數、浮點數直接書寫,支持科學計數法。
布爾值
enabled: true debug-mode: False # 實際解析為 false
使用?
true
/false
(不區分大小寫)。日期
create-date: 2023-10-01 # 日期 timestamp: 2023-10-01T12:00:00+08:00 # 日期時間
遵循 ISO 8601 格式,如?
yyyy-MM-dd
。null 值
description: null value: ~
用?
null
?或?~
?表示。
2.3.3配置讀取
YML 配置的讀取方式與 Properties 類似,但更推薦對象綁定以發揮層級優勢。
@Value 注解
@Value("${server.port}") private int port;@Value("${user.name}") private String userName;
直接注入單個配置值(與 Properties 一致)。
@ConfigurationProperties 綁定對象
# YML 配置 database:url: jdbc:mysql://localhost/testusername: rootpool-size: 10
@Component @ConfigurationProperties(prefix = "database") public class DatabaseConfig {private String url;private String username;private int poolSize; // 支持駝峰命名自動匹配(pool-size → poolSize)// Getter & Setter }
將層級配置映射到 Java 對象的字段,適合復雜配置。
Environment 對象
@Autowired private Environment env;public void readConfig() {String url = env.getProperty("database.url");int poolSize = env.getProperty("database.pool-size", Integer.class); }
動態獲取配置值,支持類型轉換。
2.3.4配置對象和集合
YML 天然支持復雜數據結構的定義,無需拆分鍵名。
對象嵌套
user:name: Aliceage: 25address: # 嵌套對象city: Beijingstreet: Zhongguancun
Java 實體類綁定:
@ConfigurationProperties(prefix = "user") public class User {private String name;private int age;private Address address; // 內部類 Address 需定義 city 和 street 字段 }
通過縮進表示對象層級。
集合(List 和 Map)
# List 示例 servers:- 192.168.1.1- 192.168.1.2# Map 示例(兩種寫法等效) config:properties: key1: value1key2: value2# 或properties: {key1: value1, key2: value2}
Java 實體類綁定:
@ConfigurationProperties(prefix = "servers") public class ServerList {private List<String> servers; // 自動映射 List }@ConfigurationProperties(prefix = "config") public class AppConfig {private Map<String, String> properties; // 自動映射 Map }
List:用?
-
?表示列表項。Map:直接寫鍵值對或使用?
{}
。
2.3.5優缺點
優點:
結構清晰:層級縮進直觀展示配置關系,適合復雜業務場景。
類型豐富:自動識別字符串、數值、布爾值、日期等類型。
代碼簡潔:通過?
@ConfigurationProperties
?一鍵綁定對象,減少冗余代碼。多行文本支持:無需拼接符即可定義長文本。
缺點:
縮進敏感:縮進錯誤(如混用空格和 Tab)會導致解析失敗。
兼容性限制:舊版本 IDE 或工具可能不支持 YAML(需安裝插件)。
學習成本:對新手來說,層級規則和語法細節需時間熟悉。
2.4綜合練習:驗證碼案例
源碼:src/main/java/captcha · 愛吃烤雞翅的酸菜魚/springboot學習 - 碼云 - 開源中國https://gitee.com/crjs-hao/springboot/tree/master/src/main/java/captcha
2.4.1分析需求
- 頁面生成驗證碼。
- 輸入驗證碼,點擊提交,驗證用戶輸入驗證碼是否正確,正確則進行頁面跳轉。
2.4.2接口
1. 生成驗證碼
請求URL:
/captcha/getCaptcha
響應:驗證碼圖片內容
說明:瀏覽器向服務器發送/captcha/getCaptcha
請求,服務器返回驗證碼圖片并在瀏覽器頁面顯示。
2. 校驗驗證碼是否正確
請求URL:
/captcha/check
請求參數:captcha=xn8d
參數說明:captcha
為用戶輸入的驗證碼。
響應:true
或false
說明:根據用戶輸入的驗證碼校驗是否正確,true
表示驗證成功,false
表示驗證失敗。?
2.4.3介紹hutool
官網:Hutool🍬一個功能豐富且易用的Java工具庫
官方文檔:簡介 | Hutool
特點:
??簡單易用:方法命名直觀,API 設計友好,降低學習成本。
??功能全面:涵蓋 Java 開發中的常見工具需求,減少依賴第三方庫。
??高性能:優化底層實現,避免重復造輪子。
??模塊化設計:可按需引入特定模塊,避免項目臃腫。
maven引入依賴:
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version> <!-- 使用最新版本 -->
</dependency>
2.4.4代碼實現
代碼結構:
先配置好yml文件:
spring:application:name: springboot
captcha:width: 150height: 50session:key: CAPTCHA_SESSION_KEYdate: CAPTCHA_SESSION_DATE
2.4.4.1后端實現
@RequestMapping("/captcha")
@RestController
public class CaptchaController {@Autowiredprivate CaptchaPropertities captchaPropertities;private final static Long VALID_TIME = 30 * 60 * 1000L;@RequestMapping("/getCaptcha")public void getCaptcha(HttpServletResponse response, HttpSession session){response.setContentType("image/jpg");response.setCharacterEncoding("utf-8");//生成驗證碼try {ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(captchaPropertities.getWidth(), captchaPropertities.getHeight());String code = captcha.getCode();session.setAttribute(captchaPropertities.getSession().getKey(), code);session.setAttribute(captchaPropertities.getSession().getDate(), new Date());captcha.write(response.getOutputStream());} catch (IOException e) {e.printStackTrace();}
// }finally {
// response.getOutputStream().close();
// }}/*** 驗證用戶輸入的驗證碼是否正確* @param captcha: 用戶輸入的驗證碼* @param session* @return false: 校驗失敗, true: 成功*/@RequestMapping("/check")public boolean check(String captcha,HttpSession session){if(!StringUtils.hasLength(captcha)){return false;}String code = (String) session.getAttribute(captchaPropertities.getSession().getKey());Date date = (Date) session.getAttribute(captchaPropertities.getSession().getDate());//驗證碼正確且沒有過期if(captcha.equalsIgnoreCase(code) && date != null && System.currentTimeMillis() - date.getTime() < VALID_TIME){return true;}return false;}
}
?1. 驗證碼生成流程 (
/getCaptcha
)
初始化響應
設置響應類型為圖片 (
image/jpg
) 和字符編碼 (utf-8
)。生成驗證碼
使用 Hutool 的?
ShearCaptcha
?工具生成指定寬高的圖形驗證碼。獲取驗證碼文本 (
code
) 并存入 Session,同時記錄生成時間。返回驗證碼圖片
將驗證碼圖片寫入響應輸出流,供前端顯示。
異常處理
捕獲并打印?
IOException
,確保生成失敗時不影響程序運行。
2. 驗證碼校驗流程 (
/check
)
參數檢查
檢查用戶輸入的驗證碼是否為空,若空則直接返回?
false
。Session 驗證
從 Session 中獲取存儲的驗證碼文本 (
code
) 和生成時間 (date
)。校驗邏輯
驗證碼正確性:忽略大小寫比較用戶輸入與 Session 中的驗證碼。
時效性檢查:驗證碼需在有效期內(30 分鐘內)。
返回結果
若驗證碼正確且未過期,返回?
true
;否則返回?false
。
3. 關鍵設計點
Session 存儲:驗證碼文本和生成時間通過 Session 共享,確保安全性和狀態管理。
時效控制:通過?
VALID_TIME
(30 分鐘)限制驗證碼有效期,增強安全性。工具庫集成:利用 Hutool 的?
CaptchaUtil
?快速生成圖形驗證碼,簡化開發。
package captcha.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;@ConfigurationProperties(prefix = "captcha")
@Configuration
@Data
public class CaptchaPropertities {private Integer width;private Integer Height;private Session session;@Datapublic static class Session{private String key;private String date;}
}
1. 核心作用
這是一個基于Spring Boot的配置屬性綁定類,主要功能是:
集中管理驗證碼相關的所有配置參數
實現配置與代碼的分離,提高靈活性和可維護性
2. 關鍵設計
配置綁定
使用
@ConfigurationProperties
注解綁定配置文件中的屬性
prefix="captcha"
表示所有配置以captcha
為前綴配置分組
主配置項:驗證碼圖片的
width
和Height
嵌套配置:通過內部類
Session
管理session相關的配置項自動配置
@Configuration
使該類成為Spring配置類
@Data
自動生成getter/setter等方法
2.4.4.2前端核心實現
<script>$("#Img").click(function () {$(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();});$("#checkCaptcha").click(function () {$.ajax({type: "post",url: "/captcha/check",data: {captcha: $("#inputCaptcha").val()},success: function(result){if(result){location.href = "success.html";}else {alert("驗證碼錯誤, 請重新輸入");}}});});</script>
1. 驗證碼刷新功能
實現方式:
通過jQuery的
click
事件綁定圖片點擊事件點擊時先隱藏圖片,然后修改src屬性(添加時間戳防止緩存),最后淡入顯示
技術要點:
使用
new Date().getTime()
添加時間戳參數,強制瀏覽器重新請求圖片
hide()
和fadeIn()
實現平滑的視覺過渡效果2. 驗證碼校驗功能
實現方式:
通過AJAX POST請求發送用戶輸入的驗證碼到服務端校驗
根據返回結果進行頁面跳轉或錯誤提示
技術要點:
使用jQuery的
$.ajax
方法發送異步請求成功回調中根據服務端返回的布爾值進行不同處理
location.href
實現驗證成功后的頁面跳轉3. 整體交互流程
用戶點擊驗證碼圖片 → 刷新驗證碼
用戶輸入驗證碼并點擊校驗按鈕 → 發送AJAX請求
服務端返回校驗結果 → 前端根據結果跳轉或提示
4. 安全性考慮
時間戳參數防止瀏覽器緩存驗證碼圖片
POST請求方式避免驗證碼出現在URL中
服務端校驗結果決定后續操作
3.小結
今天的分享到這里就結束了,喜歡的小伙伴點點贊點點關注,需要所有的源代碼可以去我的gitee上就可以啦~你的支持就是對我最大的鼓勵,大家加油!
另外最后的最后,歡迎大家加入我的社區哦,初創社區難免經驗不足,請大家多多包涵,也歡迎大家前來多多交流。
愛吃烤雞翅的酸菜魚社區-CSDN社區云https://bbs.csdn.net/forums/aaa1f71356f6475db42ea9ea09a392bc?spm=1001.2014.3001.6682
?