当前位置: 首页 > news >正文

[Java EE 进阶] SpringBoot 配置文件全解析:properties 与 yml 的使用与实战(1)

配置文件主要是为了解决硬编码(将代码写死)带来的问题 , 把可能会改变的信息 , 放在一个集中的地方 , 当我们启动某个程序时 , 应用程序从配置文件中读取数据 , 并加载运行

本文将从配置文件的核心作用出发,详细讲解两种格式的语法、使用方式,结合实战案例对比差异,并补充实用开发技巧,帮你高效掌握 SpringBoot 配置文件的使用

一.配置文件的价值

配置文件的本质是 :解耦可变配置与业务代码

在 Spring Boot 中 , 配置文件主要有以下作用

  1. 配置项目基础信息 : Tomcat 启动端口 , 项目上下文路径
  2. 配置第三方依赖 : 如数据库连接 URL , 用户名 , 密码 , Redis , MQ 的连接信息
  3. 配置自定义业务数据 : 如验证码的宽高 , 接口超时时间 , 文件上传大小限制
  4. 配置日志与环境 : 如日志级别 , 开发/测试/生产环境的差异化配置

二. SpringBoot 主流配置文件格式

SpringBoot 支持application.properties , application.yml , application.yaml三种配置文件(其中 yml 和 yaml 格式完全一致) ; properties 是默认格式 , yml 是实际开发中使用频率最高的格式

加载规则 :

  1. SpringBoot 启动时 , 会自动从 resource 目录加载文件
  2. properties 和 yml 可并存于一个项目 , 当配置冲突时以 properties 为准
  3. 实际开发中建议统一使用一种格式

三.传统配置 : properties 格式详解

properties 是最早器的配置文件格式 , 也是 SpringBoot 创建时默认生成的配置文件 , 其语法简单 , 兼容性高 , 适合简单的键值对配置

本章节只对 properties 做简单介绍

1.基本语法

以键值对形式配置 , key 和 value 通过 = 连接 , 使用 # 添加注解

spring.application.name=SpringIOC # 配置Tomcat端口 server.port=9090 # 配置MySQL数据库连接 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=root

2.读取配置文件

使用 @Value("${key}")注解即可读取配置文件内容 , 适用于单个零散的配置的读取

#自定义配置 my.config.name = SpringBoot
package com.boop.springioc.TestNode.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/propertiesConfig") public class propertiesConfig { @Value("${my.config.name}") private String configName; @RequestMapping("/read") public String readConfig(){ return "从properties读取的配置:" + configName; } }

http://127.0.0.1:8080/propertiesConfig/read

3.缺点分析

properties 最大的问题是存在大量冗余的 key 前缀

四.主流配置 : yml 格式超详解

yml 是 YAML(Yey Another Markup Language)的简写 , 是一种树形结构的配置文件 , 采用缩进表示乘积 , 解决了 properties 的冗余问题 , 支持更多的数据类型(对象 , 集合 , Map) , 可读性好 , 是目前 SpringBoot 开发的首选格式

1. 核心基础语法

  1. 采用 key: value 格式 ,冒号后必须跟一个英文空格
  2. 用缩进表示层级关系, 缩进只能用空格 , 不能用 Tab
  3. 使用#添加注释
  4. 大小写敏感

2. yml 配置不同的数据类型和 null

#字符串 string.value: Hello #布尔值 boolean.value: true #整数 int.value: 10 #浮点数 float.value: 1.232 #null null.value: ~ #空字符串 empty.value: ''

注意:

yml 中字符串可以加单引号''或双引号"" , 二者的核心区别是 : 是否转移特殊字符(\n , \t)

  1. 不加单引号 : 默认不专一特殊字符 , 使其变为普通字符串显示
  2. 单引号 : 强制转义特殊字符 , 使其失去原有含义
  3. 双引号 : 不转义特殊字符 , 保留其原有含义
string: # 不加引号:\n作为普通字符串 str1: Hello \n SpringBoot # 单引号:\n被转义,普通字符串 str2: 'Hello \n SpringBoot' # 双引号:\n表示换行,保留特殊含义 str3: "Hello \n SpringBoot"
package com.boop.springioc.TestNode.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/ymlConfig") public class ymlConfig { @Value("${string.str1}") private String str1; @Value("${string.str2}") private String str2; @Value("${string.str3}") private String str3; @RequestMapping("/print") public void printString(){ System.out.println(str1); System.out.println(str2); System.out.println(str3); } }

http://127.0.0.1:8080/ymlConfig/print

报错解析:

一般是配置文件中变量的名字和需要注入的名字不相同 , 注意前缀和大小写敏感

3. yml 配置读取

与 properties 相同

my: config: name: SpringIOC
package com.boop.springioc.TestNode.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/propertiesConfig") public class propertiesConfig { @Value("${my.config.name}") private String configName; @RequestMapping("/read") public String readConfig(){ return "从properties读取的配置:" + configName; } }

http://127.0.0.1:8080/propertiesConfig/read

4.复杂类型的配置 : 对象/List/Map

4.1 配置对象

有两种写法 :普通缩进和行内两种

person1: id: 1 name: zhangsan age: 18 person2: {id: 2,name: Java,age: 165}
package com.boop.springioc.TestNode.model; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "person2") //@ConfigurationProperties(prefix = "person1") @Data public class Person { private Integer id; private String name; private Integer age; }
package com.boop.springioc.TestNode.Config; import com.boop.springioc.TestNode.model.Person; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/ymlConfig") public class ymlConfig { // @Autowired private Person p1; @RequestMapping("/print") public void printString(){ System.out.println(p1); // System.out.println(str1); // System.out.println(str2); // System.out.println(str3); }

读取对象配置 :

  1. 创建实体类 , 添加@Component(交给 Spring 管理) , @ConfigurationProperties(prefix = "person2") (指定 yml 中对应的前缀对象) , 并通过@Data 生成 toString()
  2. 在控制器中通过@Autowried 注入实体类 , 即可获取配置值

4.2 配置 List

通过缩进+短横线定义集合元素 , 同样支持两种写法

dbtypes1: name: - mysql - sqlserver - db2 dbtypes2: {name:[mysql,java,sql]}
package com.boop.springioc.TestNode.Config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @Component @ConfigurationProperties(prefix = "dbtypes1") @Data public class ListConfig { private List<String> name; }
package com.boop.springioc.TestNode.Component; import com.boop.springioc.TestNode.Config.ListConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/list") @RestController public class ListController { @Autowired private ListConfig listConfig; @RequestMapping("/readList") public String readList(){ return listConfig.toString(); } }

http://127.0.0.1:8080/list/readList

4.3 配置 Map 集合

maptypes3: map: k1: aa k2: bjs l2: kl maptypes4: {map: {k1: kk1, k2: kk2, k3: kk3}}
package com.boop.springioc.TestNode.Config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.HashMap; @Component @ConfigurationProperties(prefix = "maptypes3") @Data public class MapConfig { private HashMap<String, String> map; }
package com.boop.springioc.TestNode.Component; import com.boop.springioc.TestNode.Config.MapConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/map") public class mapController { @Autowired private MapConfig mapConfig; @RequestMapping("/readMap") public String readStudent(){ return mapConfig.toString(); } }

http://127.0.0.1:8080/map/readMap

5.优缺点

优点:

  1. 可读性高 , 写法简单 , 易于理解
  2. 支持更多的数据类型
  3. 支持更多编程语言(Go , Python , Ruby , JS)

缺点:

  1. 不适合写复杂文件

  1. 注意层级划分

五.properties 与 yml 核心对比

对比维度

properties

yml

语法格式

扁平键值对(key=value)

树形结构(key: value,缩进表示层级)

冗余性

存在大量重复 key 前缀,冗余度高

树形结构,无冗余前缀

数据类型

仅支持基础类型(字符串、数字、布尔)

支持基础类型 + 对象 / List/Map 等复杂类型

读取方式

仅 @Value 注解

基础类型用 @Value,复杂类型用 @ConfigurationProperties

格式要求

宽松,无缩进 / 空格要求

严格,冒号后必须有空格,缩进只能用空格

优先级

高(与 yml 冲突时生效)

低(与 properties 冲突时失效)

适用场景

简单配置、超复杂嵌套配置、需兼容老项目

绝大多数日常开发场景、复杂类型配置、追求可读性

http://www.jsqmd.com/news/517742/

相关文章:

  • 基于STM32+LiteOS的多传感器空气质量监测系统设计
  • 2026年铝单板厂家推荐:大型建筑幕墙项目高精度加工靠谱品牌及用户口碑 - 品牌推荐
  • Gauss求积公式实战:从Legendre到Laguerre的Python实现与对比
  • Mac用户必看:2025年谷歌浏览器隐藏功能大揭秘(附实用插件推荐)
  • 从感知到解耦:MANet如何用类内/类间关系网络破解航拍图像多尺度分割难题
  • 避坑指南:解决CARLA+Autoware自定义地图导入后,车辆在RViz中定位漂移的实战方案
  • 上海名表寄修流程全解析:从百达翡丽到欧米茄,高端腕表异地送修的安全指南与北上广深杭宁六城服务网络 - 时光修表匠
  • Asian Beauty Z-Image Turbo生产环境:7×24小时稳定运行的本地人像服务
  • 企业安全内网部署:基于Qwen-Image-Edit-F2P为内部系统添加智能头像生成功能
  • Qwen-Image-2512-SDNQ Web服务实战落地:教育行业课件插图自动化生成
  • 2026年铝单板厂家推荐:大型建筑幕墙项目高可靠性品牌及工程口碑真实评价 - 品牌推荐
  • ABB机器人数据采集避坑指南:从REST API到数据库,一步步教你搭建状态监控看板
  • Tinymce 6.x 本地视频上传终极指南:Vue3 + Axios 实战踩坑记录
  • Matlab新手也能玩转遗传算法:从零实现一个简易车间布局优化器
  • 2026年密封条厂家推荐:门窗建筑与机械设备密封靠谱厂家及用户口碑评价 - 品牌推荐
  • 2026年铝单板厂家推荐:大型公建幕墙项目高精度加工靠谱品牌及合作案例 - 品牌推荐
  • LoRa-01SC-P低功耗模式深度优化:如何将接收电流从11mA降到3mA?
  • 2026年铝单板厂家推荐:异形曲面定制加工口碑厂家与选购避坑要点分析 - 品牌推荐
  • MVC 与 MVVM 区别 - 鸿蒙
  • 用Python搞定交通流量预测:从数据清洗到LSTM建模的保姆级实战(附明尼苏达州数据集)
  • 小程序毕业设计springboot基于微信小程序的同城上门遛喂宠物系统
  • 7za极简移植指南:5分钟为树莓派编译轻量版7zip
  • EXPERIMENTAL RESULTS
  • 手把手复现TomoSAR仿真实验:基于Python的压缩感知三维成像全流程(附DEM对比)
  • Android地图开发踩坑记:从MapLibre Native集成到成功显示第一个Marker的完整流程
  • ZYNQ DMA数据传输实战:从PL到PS的调试与优化
  • 避开这5个坑,你的FreeModbus移植才算成功 | 基于FreeRTOS的实战经验
  • GPU内存访问的隐藏陷阱:为什么你的CUDA程序跑得不够快?
  • Chromium ARM交叉编译实战:用x86主机为飞腾电脑打包浏览器(含硬件加速配置)
  • 深入解析nslookup命令:从基础查询到高级DNS诊断