跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Boot 配置文件深度解析

综述由AI生成Spring Boot 配置文件支持 Properties 和 YAML 两种主要格式。Properties 采用键值对,YAML 支持树形结构且优先级较低。读取配置可使用 @Value 注解或 @ConfigurationProperties 绑定对象。通过图形验证码案例演示了如何将配置项集成到业务中,解决了硬编码问题,提升了灵活性。

漫步发布于 2026/3/28更新于 2026/6/617 浏览
Spring Boot 配置文件深度解析

Spring Boot 配置文件深度解析

1. 配置文件概述:告别硬编码

在软件开发中,硬编码 (Hard Coding) 是指将数据直接嵌入源代码的行为。这种做法会导致程序灵活性差,例如手机字体大小若被写死,将无法满足不同用户的偏好。

配置文件的作用在于解决硬编码问题,将易变信息(如数据库连接、端口号、第三方密钥)集中管理。当程序启动时,它会从配置文件中读取数据并加载运行,从而实现用户与应用的交互。

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

Spring Boot 在启动时会自动从 classpath 路径寻找并加载以下格式的文件:

格式名称后缀名特点
Properties.properties早期默认格式,创建项目时的默认选择
YAML.yml缩写形式,开发中最常用,支持树形结构
YAML.yaml全称形式,与 .yml 使用方式一致
2.1 优先级与共存说明
  • 共存性:理论上两者可并存于同一项目。
  • 优先级:当配置冲突时,.properties 的优先级高于.yml。
  • 建议:实际开发中应统一使用一种格式以降低维护成本。

3. Properties 语法与读取实战

3.1 基础语法

Properties 采用 key=value 的键值对形式,使用 # 作为注释。 文件配置如下:

# 设置项目启动端口
server.port=8080
# 数据库连接配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb
spring.datasource.username=root
3.2 使用 @Value 读取配置

在 Java 代码中,可以使用 ${} ({}里面填写键名) 格式配合 @Value 注解主动读取内容。

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;
    }
}

运行效果:

在这里插入图片描述

3.3 properties 缺点

properties 配置是以 key-value 的形式配置的,如下图所示:

在这里插入图片描述

从上述配置 key 看出,properties 配置文件中会有很多的冗余的信息,比如这些:

在这里插入图片描述

想要解决这个问题,就得使用 yml 配置文件的格式化了。

4. YAML (YML) 进阶指南

YAML 是一种树形结构的标记语言,通过缩进表示层级。

4.1 核心语法规范

在这里插入图片描述

  1. 冒号空格:key 和 value 之间必须有 英文冒号 + 空格,空格不可省略。
  2. 数据类型支持:支持字符串、布尔值、整数、浮点数以及 null(用 ~ 表示)。

单层级与多层级的表示规则

在这里插入图片描述

多层级的 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";
    }
}

运行结果

在这里插入图片描述

打印配置

在这里插入图片描述

4.3 字符串的引号差异

YAML 中字符串默认不加引号,但单双引号有本质区别:

  • 单引号 (''):会转义特殊字符,使其变为普通字符串(如 输出为字符 )
  • 双引号 (""):不会转义特殊字符,保留其本身含义(如 输出为换行)

在这里插入图片描述

在这里插入图片描述

4.4 对象、集合与 Map 的读取
配置对象

YML 配置示例:

student:
  id: 1
  name: Java
  age: 18

Java 实体类映射: 对于复杂数据形态,建议使用 @ConfigurationProperties 注解。

@Data
@ConfigurationProperties(prefix = "student") // 会从配置文件中找到 student 的前缀
@Configuration
public class Student {
    private Integer id;
    private String name;
    private Integer age;
}

运行打印结果

在这里插入图片描述

配置集合

YML 配置示例:

dbtypes:
  name:
    - mysql
    - sqlserver
    - db2
  map:
    k1: kk1
    k2: kk2
    k3: kk3

Java 实体类映射: 对于复杂数据形态,建议使用 @ConfigurationProperties 注解。

@Data
@ConfigurationProperties(prefix = "dbtypes")
@Configuration
public class DbTypeConfig {
    private List<String> name;
    private Map<String, String> map;
}

运行打印结果

在这里插入图片描述

5. 综合性练习:验证码案例实战

在这里插入图片描述

本案例基于 Hutool 第三方工具包实现一个后端生成、校验验证码的功能。

在这里插入图片描述

在这里插入图片描述

5.1 需求分析
  1. 后端生成验证码图片并返回流。
  2. 将验证码及其生成时间存入 Session。
  3. 用户提交验证码,后端校验一致性及有效期(1 分钟内有效)。
5.2 约定前后端交互接口

接口定义

  1. 生成验证码 请求 URL:/captcha/getCaptcha 响应:验证码图片内容

校验验证码是否正确 请求:/captcha/check

请求 URL:/captcha/check 请求参数:captcha=xn8d 
响应:true
根据用户输入的验证码,校验验证码是否正确.true:验证成功.false:验证失败.
配置文件定义 (解决硬编码问题)

在 application.yml 中定义验证码的尺寸及 Session 的 Key:

spring:
  application:
    name: spring-captcha-demo
  captcha:
    width: 100
    height: 40
  # 通过设置 session 配置项,避免日后需要到处修改
  session:
    code: SESSION_CODE_KEY
    date: SESSION_DATE_KEY
验证码相关接口
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
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 VALID_MILLIS_TIME = 5 * 60 * 1000;

    @RequestMapping("/getCaptcha")
    public void genCaptcha(HttpServletRequest request, HttpServletResponse response) {
        // 定义图形验证码的长和宽
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());
        String code = lineCaptcha.getCode();
        System.out.println(code);
        // 图形验证码写出,可以写出到文件,也可以写出到流
        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);
            // 记录时间保持五分钟内有效
            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 和时间
        Object codeObj = session.getAttribute(captchaProperties.getSession().getCode());
        Object dataObj = session.getAttribute(captchaProperties.getSession().getDate());
        
        if (codeObj == null || dataObj == null) {
            return false;
        }
        
        String code = codeObj.toString();
        long data = (Long) dataObj;
        
        if (captcha.equalsIgnoreCase(code) && (System.currentTimeMillis() - data < VALID_MILLIS_TIME)) {
            return true;
        }
        return false;
    }
}
前端相关代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>验证码</title>
    <style>
        #inputCaptcha { height: 30px; vertical-align: middle; }
        #verificationCodeImg { vertical-align: middle; }
        #checkCaptcha { height: 40px; width: 100px; }
    </style>
</head>
<body>
    <h1>输入验证码</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(){
            $.ajax({
                url:'/captcha/check',
                type:'post',
                data:{ captcha:$('#inputCaptcha').val()},
                success:function(result){
                    if(result){
                        location.href ='success.html';
                    }else{
                        alert("验证码错误!");
                    }
                }
            });
        });
    </script>
</body>
</html>
运行结果

在这里插入图片描述

在这里插入图片描述

6. 总结

  • Properties 语法简单但存在冗余,适用于简单项目。
  • YAML 结构清晰、支持类型丰富,是目前 Spring Boot 开发的主流选择。
  • 读取技巧:简单配置用 @Value,结构化配置(对象/集合)首选 @ConfigurationProperties。
  • 建议:yml 可以和 properties 共存,但一个项目中建议只使用一种配置类型文件

参考链接:

  • Spring Boot 官方外部配置文档
  • Hutool 第三方工具地址

目录

  1. Spring Boot 配置文件深度解析
  2. 1. 配置文件概述:告别硬编码
  3. 2. Spring Boot 配置文件的三大格式
  4. 2.1 优先级与共存说明
  5. 3. Properties 语法与读取实战
  6. 3.1 基础语法
  7. 设置项目启动端口
  8. 数据库连接配置
  9. 3.2 使用 @Value 读取配置
  10. 3.3 properties 缺点
  11. 4. YAML (YML) 进阶指南
  12. 4.1 核心语法规范
  13. 4.2 yaml 语法与读取示例
  14. 4.3 字符串的引号差异
  15. 4.4 对象、集合与 Map 的读取
  16. 配置对象
  17. 配置集合
  18. 5. 综合性练习:验证码案例实战
  19. 5.1 需求分析
  20. 5.2 约定前后端交互接口
  21. 配置文件定义 (解决硬编码问题)
  22. 通过设置 session 配置项,避免日后需要到处修改
  23. 验证码相关接口
  24. 前端相关代码
  25. 运行结果
  26. 6. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 在汽车电子行业中的应用:基础知识与概念
  • uniapp 通用价格组件开发与 DCloud 插件市场发布指南
  • C++ string 类进阶:成员函数与全局操作实战指南
  • Git 入门:环境配置、核心概念与文件操作
  • Linux 多机管理方案:禁用 root 密码与面板批量运维
  • 基于 OpenClaw 的三省六部制多 Agent 系统 Windows 移植版
  • Visual C++ Redistributable 运行库安装与 DLL 缺失修复指南
  • 二叉树高频节点问题解析
  • SketchUp STL 插件实现 3D 打印模型高效导出
  • Code2Prompt 工具使用指南:将本地项目打包为 AI 提示词
  • Java 使用 Apache POI 导出 Excel 文件
  • Chambolle-Pock 算法在医学影像重建中的应用
  • Stable Diffusion v1.5 创意工作流整合:Figma/Notion/Slack 自动化方案
  • 贪心算法核心思想与 LeetCode 经典例题解析
  • 大模型在传统 NLP 文本分类任务中的应用实践
  • 2026 年 3 月 23 日技术资讯:AI Agent 安全与 Python 性能进展
  • LangChain 开发环境准备与 AI 大模型私有部署指南
  • Linux 生产者 - 消费者模型与条件变量详解
  • Telegram 中文搜索机器人@letstgbot 技术原理与开发实践
  • 金仓数据库 KingbaseES 实现 MongoDB 平滑迁移与性能调优实践

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online