最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2025年12月26日 09:14:57   作者:想不明白的過度思考者  
本文詳細(xì)解析了SpringBoot配置文件的作用及其主流格式,包括Properties和YAML(YML)的語法差異、優(yōu)先級及適用場景,并通過@Value與@ConfigurationProperties注解的代碼實(shí)戰(zhàn),演示了如何將配置項(xiàng)優(yōu)雅地集成到實(shí)際業(yè)務(wù)中,感興趣的朋友跟隨小編一起看看吧

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

摘要

本文深入探討了 Spring Boot 配置文件的核心作用及其主流格式。通過對比 PropertiesYAML (YML) 的語法差異、優(yōu)先級及適用場景,結(jié)合 @Value@ConfigurationProperties 注解的代碼實(shí)戰(zhàn),幫助開發(fā)者掌握配置讀取的高級技巧。文章最后通過一個“圖形驗(yàn)證碼”綜合案例,演示了如何將配置項(xiàng)優(yōu)雅地集成到實(shí)際業(yè)務(wù)中。

1. 配置文件概述:告別硬編碼

在軟件開發(fā)中,硬編碼 (Hard Coding) 是指將數(shù)據(jù)直接嵌入源代碼的行為 。這種做法會導(dǎo)致程序靈活性差,例如手機(jī)字體大小若被寫死,將無法滿足不同用戶的偏好 。

配置文件的作用在于解決硬編碼問題,將易變信息(如數(shù)據(jù)庫連接、端口號、第三方密鑰)集中管理 。當(dāng)程序啟動時,它會從配置文件中讀取數(shù)據(jù)并加載運(yùn)行,從而實(shí)現(xiàn)用戶與應(yīng)用的交互 。

2. Spring Boot 配置文件的三大格式

Spring Boot 在啟動時會自動從 classpath 路徑尋找并加載以下格式的文件 :

格式名稱后綴名特點(diǎn)
Properties.properties早期默認(rèn)格式,創(chuàng)建項(xiàng)目時的默認(rèn)選擇
YAML.yml縮寫形式,開發(fā)中最常用,支持樹形結(jié)構(gòu)
YAML.yaml全稱形式,與 .yml 使用方式一致

2.1 優(yōu)先級與共存說明

  • 共存性:理論上兩者可并存于同一項(xiàng)目 。
  • 優(yōu)先級:當(dāng)配置沖突時,.properties 的優(yōu)先級高于 .yml 。
  • 建議:實(shí)際開發(fā)中應(yīng)統(tǒng)一使用一種格式以降低維護(hù)成本 。

3. Properties 語法與讀取實(shí)戰(zhàn)

3.1 基礎(chǔ)語法

Properties 采用 key=value 的鍵值對形式,使用 # 作為注釋 。
文件配置如下:

# 設(shè)置項(xiàng)目啟動端口 
server.port=8080 
# 數(shù)據(jù)庫連接配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb
spring.datasource.username=root

3.2 使用 @Value 讀取配置

在 Java 代碼中,可以使用 ${} ({}里面填寫鍵名)格式配合 @Value 注解主動讀取內(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配置文件中會有很多的冗余的信息,比如這些:

想要解決這個問題,就得使用yml配置文件的格式化了

4. YAML (YML) 進(jìn)階指南

YAML 是一種樹形結(jié)構(gòu)的標(biāo)記語言,通過縮進(jìn)表示層級 。

4.1 核心語法規(guī)范

  • 冒號空格keyvalue 之間必須有 英文冒號+空格空格不可省略 。
  • 數(shù)據(jù)類型支持:支持字符串、布爾值、整數(shù)、浮點(diǎn)數(shù)以及 null(用 ~ 表示) 。

單層級與多層級的表示規(guī)則

多層級的key前面要空兩個格,且同級需對齊!

4.2 yaml語法與讀取示例

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 字符串的引號差異

YAML 中字符串默認(rèn)不加引號,但單雙引號有本質(zhì)區(qū)別 :

  • 單引號 (‘’):會轉(zhuǎn)義特殊字符,使其變?yōu)槠胀ㄗ址ㄈ?\n 輸出為字符 \n
  • 雙引號 (“”):不會轉(zhuǎn)義特殊字符,保留其本身含義(如 \n 輸出為換行

4.4 對象、集合與 Map 的讀取

配置對象

YML 配置示例:

student:
  id: 1
  name: Java
  age: 18

Java 實(shí)體類映射:
對于復(fù)雜數(shù)據(jù)形態(tài),建議使用 @ConfigurationProperties 注解 。

@Data
@ConfigurationProperties(prefix = "student")  // 會從配置文件中找到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: kk3

Java 實(shí)體類映射:
對于復(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)一個后端生成、校驗(yàn)驗(yàn)證碼的功能 。

5.1 需求分析

  • 后端生成驗(yàn)證碼圖片并返回流 。
  • 將驗(yàn)證碼及其生成時間存入 Session 。
  • 用戶提交驗(yàn)證碼,后端校驗(yàn)一致性及有效期(1分鐘內(nèi)有效) 。

5.2 約定前后端交互接口

接口定義

  1. 生成驗(yàn)證碼
    請求URL:/captcha/getCaptcha
    響應(yīng):驗(yàn)證碼圖片內(nèi)容
  2. 校驗(yàn)驗(yàn)證碼是否正確
    請求:/captcha/check
    請求URL: /captcha/check
    請求參數(shù): captcha=xn8d
    響應(yīng):true
    根據(jù)用戶輸?的驗(yàn)證碼,校驗(yàn)驗(yàn)證碼是否正確.true:驗(yàn)證成功.false:驗(yàn)證失敗.

配置文件定義(解決硬編碼問題)

application.yml 中定義驗(yàn)證碼的尺寸及 Session 的 Key :

spring:
  application:
    name: spring-captcha-demo
captcha:
  width: 100
  height: 40
#  通過設(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)證碼的長和寬
        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());
            //拿到這個請求的session,并且將code寫入到session
            HttpSession session = request.getSession();
            session.setAttribute(captchaProperties.getSession().getCode(), code);
            //記錄時間保持五分鐘內(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和時間
        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)證碼錯誤!");
            }
          }
        });
    });
  </script>
</body>
</html>

運(yùn)行結(jié)果

6. 總結(jié)

  • Properties 語法簡單但存在冗余,適用于簡單項(xiàng)目 。
  • YAML 結(jié)構(gòu)清晰、支持類型豐富,是目前 Spring Boot 開發(fā)的主流選擇 。
  • 讀取技巧:簡單配置用 @Value,結(jié)構(gòu)化配置(對象/集合)首選 @ConfigurationProperties 。
  • 建議:yml可以和properties共存,但?個項(xiàng)目中建議只使用?種配置類型文件

參考鏈接:

到此這篇關(guān)于Spring Boot 配置文件從基礎(chǔ)語法到驗(yàn)證碼實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Spring Boot 配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot Thymeleaf數(shù)字對象使用方法

    Springboot Thymeleaf數(shù)字對象使用方法

    這篇文章主要介紹了Springboot Thymeleaf數(shù)字對象使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2007-09-09
  • Java的“Goto”與標(biāo)簽及使用詳解

    Java的“Goto”與標(biāo)簽及使用詳解

    goto在Java中是一個保留字,但在語言中并沒有用到它;Java沒有g(shù)oto。接下來通過本文給大家介紹Java的“Goto”與標(biāo)簽,感興趣的朋友跟隨小編一起看看吧
    2018-10-10
  • Springboot如何配置yml文件與映射到j(luò)ava類

    Springboot如何配置yml文件與映射到j(luò)ava類

    這篇文章主要介紹了Springboot如何配置yml文件與映射到j(luò)ava類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java中對象的轉(zhuǎn)移之序列化與反序列化方式

    Java中對象的轉(zhuǎn)移之序列化與反序列化方式

    文章介紹了序列化與反序列化的定義和實(shí)現(xiàn)流程,重點(diǎn)闡述了Java中的序列化與反序列化實(shí)現(xiàn),包括Serializable接口、Externalizable接口、transient關(guān)鍵字等,并指出了Java原生序列化的缺點(diǎn)及替代方案FastJson和Protobuf,最終總結(jié)了選擇不同序列化工具的場景和優(yōu)勢
    2026-05-05
  • 詳解Spring Boot 2.0.2+Ajax解決跨域請求的問題

    詳解Spring Boot 2.0.2+Ajax解決跨域請求的問題

    這篇文章主要介紹了詳解Spring Boot 2.0.2+Ajax解決跨域請求的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 用java等語言仿360首頁拼音輸入全模糊搜索和自動換膚

    用java等語言仿360首頁拼音輸入全模糊搜索和自動換膚

    這篇文章主要為大家詳細(xì)介紹了仿360首頁支持拼音輸入全模糊搜索和自動換膚的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • spring?cloud?gateway限流常見算法實(shí)現(xiàn)

    spring?cloud?gateway限流常見算法實(shí)現(xiàn)

    本文主要介紹了spring?cloud?gateway限流常見算法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Java如何生成壓縮文件工具類

    Java如何生成壓縮文件工具類

    這篇文章主要介紹了Java如何生成壓縮文件工具類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Spring Boot 中的 CommandLineRunner 原理及使用示例解析

    Spring Boot 中的 CommandLineRunner 原理及使用示例

    CommandLineRunner 是 Spring Boot 提供的一個非常有用的接口,可以幫助你在應(yīng)用程序啟動后執(zhí)行初始化任務(wù),本文通過多個示例詳細(xì)介紹了如何在實(shí)際項(xiàng)目中使用 CommandLineRunner,感興趣的朋友一起看看吧
    2025-04-04
  • java使用des加密解密示例分享

    java使用des加密解密示例分享

    java使用des加密解密示例,適合java語言的所有平臺,與.net等平臺的加密解密兼容
    2014-02-02

最新評論

达州市| 鸡西市| 青浦区| 米泉市| 民和| 竹北市| 凤城市| 江都市| 云阳县| 台湾省| 承德市| 侯马市| 阿城市| 田东县| 茌平县| 霸州市| 罗源县| 紫阳县| 平阴县| 都昌县| 萝北县| 昔阳县| 皮山县| 连南| 东光县| 广南县| 重庆市| 拉孜县| 龙州县| 黔西县| 库尔勒市| 罗山县| 泽普县| 厦门市| 太谷县| 邵东县| 新密市| 凤庆县| 武安市| 荥阳市| 黄平县|