Spring Boot 配置文件從基礎(chǔ)語(yǔ)法到驗(yàn)證碼實(shí)戰(zhàn)
Spring Boot 配置文件深度解析:從基礎(chǔ)語(yǔ)法到驗(yàn)證碼實(shí)戰(zhàn)

摘要
本文深入探討了 Spring Boot 配置文件的核心作用及其主流格式。通過(guò)對(duì)比 Properties 與 YAML (YML) 的語(yǔ)法差異、優(yōu)先級(jí)及適用場(chǎng)景,結(jié)合 @Value 與 @ConfigurationProperties 注解的代碼實(shí)戰(zhàn),幫助開發(fā)者掌握配置讀取的高級(jí)技巧。文章最后通過(guò)一個(gè)“圖形驗(yàn)證碼”綜合案例,演示了如何將配置項(xiàng)優(yōu)雅地集成到實(shí)際業(yè)務(wù)中。
1. 配置文件概述:告別硬編碼
在軟件開發(fā)中,硬編碼 (Hard Coding) 是指將數(shù)據(jù)直接嵌入源代碼的行為 。這種做法會(huì)導(dǎo)致程序靈活性差,例如手機(jī)字體大小若被寫死,將無(wú)法滿足不同用戶的偏好 。
配置文件的作用在于解決硬編碼問(wèn)題,將易變信息(如數(shù)據(jù)庫(kù)連接、端口號(hào)、第三方密鑰)集中管理 。當(dāng)程序啟動(dòng)時(shí),它會(huì)從配置文件中讀取數(shù)據(jù)并加載運(yùn)行,從而實(shí)現(xiàn)用戶與應(yīng)用的交互 。
2. Spring Boot 配置文件的三大格式
Spring Boot 在啟動(dòng)時(shí)會(huì)自動(dòng)從 classpath 路徑尋找并加載以下格式的文件 :
| 格式名稱 | 后綴名 | 特點(diǎn) |
|---|---|---|
| Properties | .properties | 早期默認(rèn)格式,創(chuàng)建項(xiàng)目時(shí)的默認(rèn)選擇 |
| YAML | .yml | 縮寫形式,開發(fā)中最常用,支持樹形結(jié)構(gòu) |
| YAML | .yaml | 全稱形式,與 .yml 使用方式一致 |
2.1 優(yōu)先級(jí)與共存說(shuō)明
- 共存性:理論上兩者可并存于同一項(xiàng)目 。
- 優(yōu)先級(jí):當(dāng)配置沖突時(shí),
.properties的優(yōu)先級(jí)高于.yml。 - 建議:實(shí)際開發(fā)中應(yīng)統(tǒng)一使用一種格式以降低維護(hù)成本 。
3. Properties 語(yǔ)法與讀取實(shí)戰(zhàn)
3.1 基礎(chǔ)語(yǔ)法
Properties 采用 key=value 的鍵值對(duì)形式,使用 # 作為注釋 。
文件配置如下:
# 設(shè)置項(xiàng)目啟動(dòng)端口 server.port=8080 # 數(shù)據(jù)庫(kù)連接配置 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb spring.datasource.username=root
3.2 使用 @Value 讀取配置
在 Java 代碼中,可以使用 ${} ({}里面填寫鍵名)格式配合 @Value 注解主動(dòng)讀取內(nèi)容 。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/prop")
@RestController
public class PropertiesController {
@Value("${spring.datasource.url}")
private String url;
@RequestMapping("/read")
public String readProperties() {
return "從配置文件中讀取url" + url;
}
}運(yùn)行效果:

3.3 properties缺點(diǎn)
properties配置是以key-value的形式配置的,如下圖所示:

從上述配置key看出,properties配置文件中會(huì)有很多的冗余的信息,比如這些:

想要解決這個(gè)問(wèn)題,就得使用yml配置文件的格式化了
4. YAML (YML) 進(jìn)階指南
YAML 是一種樹形結(jié)構(gòu)的標(biāo)記語(yǔ)言,通過(guò)縮進(jìn)表示層級(jí) 。
4.1 核心語(yǔ)法規(guī)范

- 冒號(hào)空格:
key和value之間必須有 英文冒號(hào)+空格,空格不可省略 。 - 數(shù)據(jù)類型支持:支持字符串、布爾值、整數(shù)、浮點(diǎn)數(shù)以及
null(用~表示) 。
單層級(jí)與多層級(jí)的表示規(guī)則

多層級(jí)的key前面要空兩個(gè)格,且同級(jí)需對(duì)齊!
4.2 yaml語(yǔ)法與讀取示例
yaml文件配置如下

Java代碼讀取配置信息
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/yaml")
@RestController
public class yamlController {
@Value("${yaml}")
private String yaml;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@RequestMapping("/read")
public String read() {
System.out.println(yaml);
System.out.println(username);
System.out.println(password);
return "success";
}
}運(yùn)行結(jié)果

打印配置

4.3 字符串的引號(hào)差異
YAML 中字符串默認(rèn)不加引號(hào),但單雙引號(hào)有本質(zhì)區(qū)別 :
- 單引號(hào) (‘’):會(huì)轉(zhuǎn)義特殊字符,使其變?yōu)槠胀ㄗ址ㄈ?
\n輸出為字符\n) - 雙引號(hào) (“”):不會(huì)轉(zhuǎn)義特殊字符,保留其本身含義(如
\n輸出為換行)


4.4 對(duì)象、集合與 Map 的讀取
配置對(duì)象
YML 配置示例:
student: id: 1 name: Java age: 18
Java 實(shí)體類映射:
對(duì)于復(fù)雜數(shù)據(jù)形態(tài),建議使用 @ConfigurationProperties 注解 。
@Data
@ConfigurationProperties(prefix = "student") // 會(huì)從配置文件中找到student的前綴
@Configuration
public class Student {
private Integer id;
private String name;
private Integer age;
}
運(yùn)行打印結(jié)果

配置集合
YML 配置示例:
dbtypes:
name:
- mysql
- sqlserver
- db2
map:
k1: kk1
k2: kk2
k3: kk3Java 實(shí)體類映射:
對(duì)于復(fù)雜數(shù)據(jù)形態(tài),建議使用 @ConfigurationProperties 注解 。
@Data
@ConfigurationProperties(prefix = "dbtypes")
@Configuration
public class DbTypeConfig {
private List<String> name;
private Map<String, String> map;
}
運(yùn)行打印結(jié)果

5. 綜合性練習(xí):驗(yàn)證碼案例實(shí)戰(zhàn)

本案例基于 Hutool 第三方工具包實(shí)現(xiàn)一個(gè)后端生成、校驗(yàn)驗(yàn)證碼的功能 。


5.1 需求分析
- 后端生成驗(yàn)證碼圖片并返回流 。
- 將驗(yàn)證碼及其生成時(shí)間存入
Session。 - 用戶提交驗(yàn)證碼,后端校驗(yàn)一致性及有效期(1分鐘內(nèi)有效) 。
5.2 約定前后端交互接口
接口定義
- 生成驗(yàn)證碼
請(qǐng)求URL:/captcha/getCaptcha響應(yīng):驗(yàn)證碼圖片內(nèi)容 - 校驗(yàn)驗(yàn)證碼是否正確
請(qǐng)求:/captcha/check請(qǐng)求URL: /captcha/check 請(qǐng)求參數(shù): captcha=xn8d
響應(yīng):true
根據(jù)用戶輸?的驗(yàn)證碼,校驗(yàn)驗(yàn)證碼是否正確.true:驗(yàn)證成功.false:驗(yàn)證失敗.
配置文件定義(解決硬編碼問(wèn)題)
在 application.yml 中定義驗(yàn)證碼的尺寸及 Session 的 Key :
spring:
application:
name: spring-captcha-demo
captcha:
width: 100
height: 40
# 通過(guò)設(shè)置session配置項(xiàng),避免日后需要到處修改
session:
code: SESSION_CODE_KEY
date: SESSION_DATE_KEY驗(yàn)證碼相關(guān)接口
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.overthinker.spring.captcha.demo.model.CaptchaProperties;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RestController
@RequestMapping("/captcha")
public class CaptchaController {
@Autowired
private CaptchaProperties captchaProperties;
private static long VILD_MiLLTS_TIME = 5 * 60 * 1000;
@RequestMapping("/getCaptcha")
public void genCaptcha(HttpServletRequest request, HttpServletResponse response) {
//定義圖形驗(yàn)證碼的長(zhǎng)和寬
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());
String code = lineCaptcha.getCode();
System.out.println(code);
//圖形驗(yàn)證碼寫出,可以寫出到文件,也可以寫出到流
try {
response.setContentType("image/jpeg");
response.setHeader("Pragma", "No-cache");
lineCaptcha.write(response.getOutputStream());
//拿到這個(gè)請(qǐng)求的session,并且將code寫入到session
HttpSession session = request.getSession();
session.setAttribute(captchaProperties.getSession().getCode(), code);
//記錄時(shí)間保持五分鐘內(nèi)有效
session.setAttribute(captchaProperties.getSession().getDate(), System.currentTimeMillis());
response.getOutputStream().close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@RequestMapping("/check")
public Boolean checkCaptcha(String captcha, HttpSession session) {
//先判斷是否為空
if(!StringUtils.hasLength(captcha)) {
return false;
}
// 從session中獲取code和時(shí)間
String code = session.getAttribute(captchaProperties.getSession().getCode()).toString();
long data = (long)session.getAttribute(captchaProperties.getSession().getDate());
if(captcha.equalsIgnoreCase(code) && (System.currentTimeMillis() - data < VILD_MiLLTS_TIME)) {
return true;
}
return false;
}
}前端相關(guān)代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>驗(yàn)證碼</title>
<style>
#inputCaptcha {
height: 30px;
vertical-align: middle;
}
#verificationCodeImg{
vertical-align: middle;
}
#checkCaptcha{
height: 40px;
width: 100px;
}
</style>
</head>
<body>
<h1>輸入驗(yàn)證碼</h1>
<div id="confirm">
<input type="text" name="inputCaptcha" id="inputCaptcha">
<img id="verificationCodeImg" src="/captcha/getCaptcha" style="cursor: pointer;" title="看不清?換一張" />
<input type="button" value="提交" id="checkCaptcha">
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
$("#verificationCodeImg").click(function(){
$(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();
});
$("#checkCaptcha").click(function () {
// alert("驗(yàn)證碼校驗(yàn)");
$.ajax({
url:'/captcha/check',
type:'post',
data:{
captcha:$('#inputCaptcha').val()
},
success:function (result) {
if(result){
location.href = 'success.html';
}else {
alert("驗(yàn)證碼錯(cuò)誤!");
}
}
});
});
</script>
</body>
</html>運(yùn)行結(jié)果


6. 總結(jié)
- Properties 語(yǔ)法簡(jiǎn)單但存在冗余,適用于簡(jiǎn)單項(xiàng)目 。
- YAML 結(jié)構(gòu)清晰、支持類型豐富,是目前 Spring Boot 開發(fā)的主流選擇 。
- 讀取技巧:簡(jiǎn)單配置用
@Value,結(jié)構(gòu)化配置(對(duì)象/集合)首選@ConfigurationProperties。 - 建議:yml可以和properties共存,但?個(gè)項(xiàng)目中建議只使用?種配置類型文件
參考鏈接:
到此這篇關(guān)于Spring Boot 配置文件從基礎(chǔ)語(yǔ)法到驗(yàn)證碼實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Spring Boot 配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 零基礎(chǔ)全面解析SpringBoot配置文件(結(jié)合驗(yàn)證碼案例)
- Springboot的配置文件及其優(yōu)先級(jí)說(shuō)明
- Springboot配置文件相關(guān)語(yǔ)法及讀取方式詳解
- 對(duì)SpringBoot項(xiàng)目配置文件進(jìn)行加密實(shí)現(xiàn)過(guò)程
- springboot啟動(dòng)讀取外部配置文件實(shí)現(xiàn)方式
- Springboot整合Jasypt對(duì)配置文件中的密碼加密的步驟
- 項(xiàng)目中SpringBoot配置文件未生效的原因分析與解決方法
- SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼的示例代碼
相關(guān)文章
Springboot Thymeleaf數(shù)字對(duì)象使用方法
這篇文章主要介紹了Springboot Thymeleaf數(shù)字對(duì)象使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2007-09-09
Springboot如何配置yml文件與映射到j(luò)ava類
這篇文章主要介紹了Springboot如何配置yml文件與映射到j(luò)ava類問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Java中對(duì)象的轉(zhuǎn)移之序列化與反序列化方式
文章介紹了序列化與反序列化的定義和實(shí)現(xiàn)流程,重點(diǎn)闡述了Java中的序列化與反序列化實(shí)現(xiàn),包括Serializable接口、Externalizable接口、transient關(guān)鍵字等,并指出了Java原生序列化的缺點(diǎn)及替代方案FastJson和Protobuf,最終總結(jié)了選擇不同序列化工具的場(chǎng)景和優(yōu)勢(shì)2026-05-05
詳解Spring Boot 2.0.2+Ajax解決跨域請(qǐng)求的問(wèn)題
這篇文章主要介紹了詳解Spring Boot 2.0.2+Ajax解決跨域請(qǐng)求的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
用java等語(yǔ)言仿360首頁(yè)拼音輸入全模糊搜索和自動(dòng)換膚
這篇文章主要為大家詳細(xì)介紹了仿360首頁(yè)支持拼音輸入全模糊搜索和自動(dòng)換膚的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
spring?cloud?gateway限流常見算法實(shí)現(xiàn)
本文主要介紹了spring?cloud?gateway限流常見算法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
Spring Boot 中的 CommandLineRunner 原理及使用示例
CommandLineRunner 是 Spring Boot 提供的一個(gè)非常有用的接口,可以幫助你在應(yīng)用程序啟動(dòng)后執(zhí)行初始化任務(wù),本文通過(guò)多個(gè)示例詳細(xì)介紹了如何在實(shí)際項(xiàng)目中使用 CommandLineRunner,感興趣的朋友一起看看吧2025-04-04

