Spring Boot 配置文件深度解析

Spring Boot 配置文件深度解析
—JavaEE专栏—

Spring Boot 配置文件深度解析:从基础语法到验证码实战


在这里插入图片描述

摘要

本文深入探讨了 Spring Boot 配置文件的核心作用及其主流格式。通过对比 PropertiesYAML (YML) 的语法差异、优先级及适用场景,结合 @Value@ConfigurationProperties 注解的代码实战,帮助开发者掌握配置读取的高级技巧。文章最后通过一个“图形验证码”综合案例,演示了如何将配置项优雅地集成到实际业务中。


目录

文章目录

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 注解主动读取内容 。

importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@RequestMapping("/prop")@RestControllerpublicclassPropertiesController{@Value("${spring.datasource.url}")privateString url;@RequestMapping("/read")publicStringreadProperties(){return"从配置文件中读取url"+ url;}}

运行效果:

在这里插入图片描述

3.3 properties缺点

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

在这里插入图片描述


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

在这里插入图片描述


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


4. YAML (YML) 进阶指南

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

4.1 核心语法规范

在这里插入图片描述
  1. 冒号空格keyvalue 之间必须有 英文冒号+空格空格不可省略
  2. 数据类型支持:支持字符串、布尔值、整数、浮点数以及 null(用 ~ 表示) 。

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

在这里插入图片描述


多层级的key前面要空两个格,且同级需对齐!

4.2 yaml语法与读取示例

yaml文件配置如下

在这里插入图片描述

Java代码读取配置信息

importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@RequestMapping("/yaml")@RestControllerpublicclass yamlController {@Value("${yaml}")privateString yaml;@Value("${spring.datasource.username}")privateString username;@Value("${spring.datasource.password}")privateString password;@RequestMapping("/read")publicStringread(){System.out.println(yaml);System.out.println(username);System.out.println(password);return"success";}}

运行结果

在这里插入图片描述


打印配置

在这里插入图片描述

4.3 字符串的引号差异

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

  • 单引号 (‘’):会转义特殊字符,使其变为普通字符串(如 \n 输出为字符 \n
  • 双引号 (“”):不会转义特殊字符,保留其本身含义(如 \n 输出为换行
在这里插入图片描述
在这里插入图片描述

4.4 对象、集合与 Map 的读取

配置对象

YML 配置示例:

student:id:1name: Java age:18

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

@Data@ConfigurationProperties(prefix ="student")// 会从配置文件中找到student的前缀@ConfigurationpublicclassStudent{privateInteger id;privateString name;privateInteger age;}

运行打印结果

在这里插入图片描述
配置集合

YML 配置示例:

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

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

@Data@ConfigurationProperties(prefix ="dbtypes")@ConfigurationpublicclassDbTypeConfig{privateList<String> name;privateMap<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:100height:40# 通过设置session配置项,避免日后需要到处修改session:code: SESSION_CODE_KEY date: SESSION_DATE_KEY 

验证码相关接口

importcn.hutool.captcha.CaptchaUtil;importcn.hutool.captcha.LineCaptcha;importcn.overthinker.spring.captcha.demo.model.CaptchaProperties;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importjakarta.servlet.http.HttpSession;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.util.StringUtils;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.io.IOException;@RestController@RequestMapping("/captcha")publicclassCaptchaController{@AutowiredprivateCaptchaProperties captchaProperties;privatestaticlongVILD_MiLLTS_TIME=5*60*1000;@RequestMapping("/getCaptcha")publicvoidgenCaptcha(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写入到sessionHttpSession session = request.getSession(); session.setAttribute(captchaProperties.getSession().getCode(), code);//记录时间保持五分钟内有效 session.setAttribute(captchaProperties.getSession().getDate(),System.currentTimeMillis()); response.getOutputStream().close();}catch(IOException e){thrownewRuntimeException(e);}}@RequestMapping("/check")publicBooleancheckCaptcha(String captcha,HttpSession session){//先判断是否为空if(!StringUtils.hasLength(captcha)){returnfalse;}// 从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)){returntrue;}returnfalse;}}

前端相关代码

<!DOCTYPEhtml><htmllang="en"><head><metacharset="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><divid="confirm"><inputtype="text"name="inputCaptcha"id="inputCaptcha"><imgid="verificationCodeImg"src="/captcha/getCaptcha"style="cursor: pointer;"title="看不清?换一张"/><inputtype="button"value="提交"id="checkCaptcha"></div><scriptsrc="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='+newDate().getTime()).fadeIn();});$("#checkCaptcha").click(function(){// alert("验证码校验"); $.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共存,但⼀个项目中建议只使用⼀种配置类型文件

参考链接:


Read more

openclaw新手入门指南:一文看懂环境搭建、模型配置与 WebUI 远程访问

openclaw新手入门指南:一文看懂环境搭建、模型配置与 WebUI 远程访问

目录 * 1. 基础设施层:OpenClaw 运行环境的初始化 * 2. 算力与模型层:蓝耘 MaaS 平台的接入配置 * 2.1 协议适配与 JSON 配置 * 3. 编排层:OpenClaw 初始化与 Onboarding 流程 * 3.1 模式选择与基础设置 * 3.2 模型提供商与应用集成策略 * 3.3 技能库(Skills)装载与服务启动 * 4. 网络架构与网关(Gateway)配置 * 4.1 网关暴露与安全策略 * 4.2 Web UI 远程访问与设备配对(Device Pairing) * 5. 高级模型编排与 JSON 配置深度解析

By Ne0inhk
FARS全自动科研系统技术深度解析:从多智能体架构到工业化科研范式

FARS全自动科研系统技术深度解析:从多智能体架构到工业化科研范式

前言 2026年2月12日至2月22日,一场持续228小时33分钟的直播在全球AI社区引发了持续震荡。屏幕另一端,一个名为FARS(Fully Automated Research System)的全自动研究系统,在没有人类干预的情况下,自主完成了从文献调研到论文撰写的完整科研流程,最终产出100篇学术论文,总消耗114亿Token,成本10.4万美元。 这场实验的意义远不止于“AI写论文”的简单升级。它向世界展示了科学发现的根本范式正在发生转移——从依赖人类灵感的“手工作坊”,转向由AI驱动的“工业化流水线”。本文将从最底层的技术细节出发,逐层拆解FARS的系统架构、智能体协作机制、资源调度策略、成本控制模型,以及与竞品的技术对比,为读者呈现一个完整的全自动科研系统技术图谱。 第一章 系统总体架构:四智能体流水线设计 1.1 核心设计理念:研究系统的第一性原理 FARS的设计并非简单地模仿人类科研流程,而是基于团队对“研究系统”本质的重新思考。创始团队提出,一个理想的研究系统应遵循两条基本原则: 1. 高效拓展知识边界:系统的吞吐量应成为核心评估指标,而非单篇论文的完

By Ne0inhk
【保姆级】Node.js 最新安装教程,附环境变量配置

【保姆级】Node.js 最新安装教程,附环境变量配置

🎬 博主名称:超级苦力怕 🔥 个人专栏:《Java成长录》《AI 工具使用目录》 🚀 每一次思考都是突破的前奏,每一次复盘都是精进的开始! 安装目录 * 零基础安装 Node.js(Windows) * 1. 下载安装包 * 2. 安装程序 * 3. 环境配置(照做即可) * 3.1 新建两个文件夹 * 3.2 设置 npm 的全局目录和缓存 * 3.3 配环境变量 * 4. 测试(配置有没有生效) * 5. (推荐)设置 npm 国内镜像(下载更快) * 6. 拓充:常见问题 * 6.1 权限不足 (EPERM) 零基础安装 Node.js(

By Ne0inhk

Token分析平台系统架构设计:从前端到核心逻辑的全景解析

导读:在上一篇文章中,我们提出了构建Token分析与成本优化平台的愿景——让企业每一分AI成本都清晰可见。但一个好的系统离不开扎实的架构设计。本文将深入剖析该平台的系统架构,从前端交互界面到后端核心逻辑,带你了解如何用FastAPI、Tiktoken、Plotly等工具搭建一个可扩展、高性能的成本监控系统。无论你是架构师还是开发者,都能从中获得可落地的设计思路。 一、引言:为什么需要清晰的架构? 在开发Token分析平台时,我们面临的挑战包括: * 如何高效处理大量日志写入? * 如何快速查询和聚合数据? * 如何让前端图表响应流畅? * 如何保证系统的可扩展性? 回答这些问题,需要一个清晰的、分层的系统架构。本文将基于三层架构模型——前端/客户端层、应用层、核心逻辑与处理层,详细拆解每一层的职责、技术选型和交互方式。 二、整体架构概览 下图展示了平台的系统架构: ┌─────────────────────────────────────┐ │ FRONTEND / CLIENT LAYER │ │ ┌────────────────────────────

By Ne0inhk