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

配置文件详解:yml多环境、配置优先级、参数绑定

配置文件详解:yml多环境、配置优先级、参数绑定

配置文件就像是项目的"控制面板",旋钮拧到哪,程序就怎么跑。拧错了,轻则乱码,重则线上事故。这篇把配置那点事儿一次说透。

一、properties vs yml对比

SpringBoot默认支持两种配置文件格式:.properties.yml(YAML)。

1.1 格式对比

properties格式(扁平结构):

server.port=8080 server.servlet.context-path=/api spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456

yml格式(树状层级):

server:port:8080servlet:context-path:/apispring:datasource:url:jdbc:mysql://localhost:3306/testusername:rootpassword:123456
对比项propertiesyml
层级表达扁平,靠点号缩进,树状结构
可读性一般好,层次清晰
支持列表不直观支持-语法
数据类型全是字符串有类型推断
重复前缀

实际开发中yml是主流,本文也以yml为主。

二、yml基础语法

2.1 核心规则

  • 缩进用空格,不用Tab(这是最容易踩的坑)
  • 缩进层级表示从属关系,同级要对齐
  • 键值对用冒号+空格分隔:key: value(冒号后面必须有空格)
  • 大小写敏感

2.2 常见数据结构

键值对:

name:张三age:25

列表(数组):

server:port:8080interests:-编程-游戏-睡觉

也可以行内写法:

interests:[编程,游戏,睡觉]

嵌套对象:

person:name:张三age:25address:city:北京street:朝阳区

三、多环境配置

3.1 为什么要多环境

开发用本地数据库,测试用测试库,生产用线上库。总不能每次发布手动改配置吧?多环境配置就是解决这个问题的。

3.2 配置文件拆分

src/main/resources/ ├── application.yml # 主配置,公共配置放这里 ├── application-dev.yml # 开发环境 ├── application-test.yml # 测试环境 └── application-prod.yml # 生产环境

application.yml(主配置):

server:port:8080spring:profiles:active:dev# 激活dev环境

application-dev.yml:

spring:datasource:url:jdbc:mysql://localhost:3306/dev_dbusername:dev_userpassword:dev_passlogging:level:root:DEBUG

application-prod.yml:

server:port:80spring:datasource:url:jdbc:mysql://192.168.1.100:3306/prod_dbusername:prod_userpassword:复杂的密码logging:level:root:WARN

3.3 激活指定环境

方式一:配置文件中激活(如上spring.profiles.active: dev

方式二:命令行参数激活(最常用)

java-jarmyapp.jar--spring.profiles.active=prod

方式三:环境变量激活

exportSPRING_PROFILES_ACTIVE=prodjava-jarmyapp.jar

四、配置优先级

SpringBoot配置来源非常多,优先级从高到低:

优先级配置来源说明
1命令行参数--server.port=9090
2SPRING_APPLICATION_JSON环境变量中的JSON配置
3ServletConfig/ServletContext初始化参数
4JNDI环境变量
5Java系统属性System.getProperties()
6操作系统环境变量
7RandomValuePropertySource随机值
8jar包外的application-{profile}.yml外部配置文件
9jar包内的application-{profile}.yml内部配置文件
10jar包外的application.yml
11jar包内的application.yml
12@PropertySource注解代码中指定的配置文件
13默认值SpringBoot硬编码的默认值

记忆口诀:外部 > 内部,命令行 > 文件,带profile > 不带profile

实际开发中最常用的是:命令行参数覆盖yml文件配置,用于线上临时调整参数。

五、参数绑定方式

5.1 @Value注解

最简单直接的方式,适合少量参数:

@RestControllerpublicclassHelloController{@Value("${server.port}")privateintport;@Value("${app.name:默认应用名}")// 冒号后是默认值privateStringappName;}

5.2 @ConfigurationProperties

适合批量绑定,将一组配置映射到Java对象:

yml配置:

app:name:我的博客系统version:1.0.0author:黑漂技术佬

配置类:

@Component@ConfigurationProperties(prefix="app")@Data// Lombok注解,自动生成getter/setterpublicclassAppProperties{privateStringname;privateStringversion;privateStringauthor;}

使用时直接注入:

@AutowiredprivateAppPropertiesappProperties;

5.3 @Value vs @ConfigurationProperties对比

对比项@Value@ConfigurationProperties
使用场景单个简单值一组相关配置
松散绑定不支持支持(app-name能绑到appName)
SpEL表达式支持不支持
JSR303校验不支持支持
元数据生成有(IDEA有提示)

松散绑定示例:yml里写app-nameapp_nameappName都能绑定到appName字段。

5.4 配置类加JSR303校验

@Component@ConfigurationProperties(prefix="app")@Data@Validated// 开启校验publicclassAppProperties{@NotBlank(message="应用名不能为空")privateStringname;@Pattern(regexp="^\\d+\\.\\d+\\.\\d+$",message="版本号格式应为x.x.x")privateStringversion;@Email(message="邮箱格式不对")privateStringemail;}

配置不合法时项目启动直接报错,把问题拦在启动阶段。

六、常见yml配置陷阱

6.1 缩进错误

# 错误:Tab和空格混用spring:\tdatasource:url:xxx

yml不允许Tab缩进,一律用空格。IDEA里设置"将Tab转为空格"可以根治这个问题。

6.2 中文乱码

properties文件默认用ISO-8859-1编码,写中文必乱码。yml默认UTF-8没这个问题。

如果必须用properties,IDEA设置:

Settings → Editor → File Encodings → Default encoding for properties files: UTF-8

同时勾选"Transparent native-to-ascii conversion"。

6.3 引号问题

# 字符串一般不需要引号name:张三# 但包含特殊字符时需要引号description:"hello: world"# 包含冒号,用引号password:'123456'# 纯数字想当字符串,用引号# 双引号会转义,单引号不转义path1:"D:\new\folder"# \n会被当成换行path2:'D:\new\folder'# 原样输出

6.4 布尔值陷阱

# 下面两个含义不同enabled:true# 布尔值trueenabled:"true"# 字符串"true"

yml有类型推断,true/false/yes/no会被识别为布尔值。绑定到String字段时如果不想被转类型,加引号。

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

相关文章:

  • Python开发环境搭建与VScode配置全攻略:从零到运行第一个程序
  • 2026年高级网络信息安全工程师证书报考条件、培训流程与证书价值一文读懂
  • 新手小白学习渗透测试第一天:对爬虫的初步了解
  • 智能开题报告工具助力本科生科研入门
  • SOTA追踪的系统方法:从PapersWithCode到实验复现的完整工作流
  • 荣耀将在中国发布配备云台手机,预热 2 亿像素相机及多种拍摄模式
  • Robei EDA:可视化模块化FPGA设计入门与实践指南
  • STM32 LCD硬件驱动原理深度解析:从接口时序到电路设计
  • 香橙派5plus GPIO
  • 协助企业申请Google Play帐号、上架
  • # 鸿蒙 HarmonyOS 应用开发实战(第38期)|密码锁(Password Lock)— Grid 网格键盘与四阶段状态机
  • vasp_raman.py 拉曼活性计算:3个步骤快速掌握VASP材料光谱分析
  • 基于机器学习的重庆市房价预测分析研究31234(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 2027 年纽约实施《儿童安全法案》:社交媒体算法推荐、午夜通知将设年龄验证
  • Agent 工作流重放与断点续传:失败任务不必从头跑(续篇)
  • 【GitHub】Bend:让 GPU 并行编程像写 Python 一样简单
  • Java开发环境搭建全攻略:从JDK安装、环境变量配置到多版本管理
  • R语言生信分析环境搭建:从CRAN、Bioconductor到GitHub的完整部署指南
  • Python图像批处理实战:从Pillow基础到21张图片批量优化
  • 2024年广东省职业院校技能大赛(高职组)大数据应用开发第05套完整参考答案
  • GJK算法实战:从原理到Unity/Unreal碰撞检测实现
  • 终极暗黑破坏神2高清补丁:D2DX三步安装教程与画质革命
  • AI康复训练指导如何精准匹配患者?揭秘FDA认证算法背后的3层动态适配机制
  • CI 中的测试策略分层:smoke、integration 与 e2e 的执行时机
  • 从A.dx到数值积分:工程实践中的微积分核心操作指南
  • # HarmonyOS ArkTS 小游戏开发实战(一):弹弹球物理碰撞游戏
  • STM32智能小车实战:从硬件选型到PID算法,手把手教你打造循迹机器人
  • 智能车图像处理:八邻域边界追踪与中心线提取实战指南
  • STM32主从定时器实现任意相位差PWM输出配置详解
  • 揭秘司法AI法条推荐准确率提升47%的关键:从语义理解到动态权重建模全流程拆解