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

【SpringBoot】12 核心功能-配置文件详解:Properties与YAML配置文件

文章目录

    • 一、配置文件基础概念
      • 1.配置文件的作用
      • 2.配置文件类型对比
    • 二、Properties配置示例
      • 1.基础属性配置
      • 2.对象嵌套配置
    • 三、YAML配置详解
      • 1.基础配置示例
      • 2.对象嵌套配置
      • 3.特殊配置说明
    • 四、配置绑定实现
      • 1.实体类定义
      • 2.配置处理器依赖
      • 3.构建配置排除
    • 五、最佳实践建议
    • 六、常见问题解决
    • 总结


一、配置文件基础概念

1.配置文件的作用

Spring Boot配置文件用于管理应用参数,包括:

  • 数据库连接配置
  • 服务器端口设置
  • 自定义属性定义
  • 多环境配置切换

2.配置文件类型对比

Spring Boot支持两种配置文件格式:

  • properties文件:传统的键值对格式
  • yaml/yml文件:结构化层次格式

二、Properties配置示例

1.基础属性配置

# 基本数据类型
person.userName=zhangsan
person.boss=true
person.birth=2019/12/9
person.age=18# 数组类型配置
person.interests[0]=篮球
person.interests[1]=足球 
person.interests[2]=18# 集合类型配置
person.animal[0]=阿猫
person.animal[1]=阿狗# Map类型配置
person.score.english=80
person.score.math=90# Set类型配置
person.salarys[0]=9999.98
person.salarys[1]=9999.99

2.对象嵌套配置

# 对象类型属性
person.pet.name=阿狗
person.pet.weight=99.99# 复杂嵌套对象
person.allPets.sick[0].name=阿狗
person.allPets.sick[0].weight=99.99
person.allPets.sick[1].name=阿猫
person.allPets.sick[1].weight=88.88
person.allPets.health[0].name=阿花
person.allPets.health[0].weight=199.99

三、YAML配置详解

1.基础配置示例

person:userName: zhangsanboss: truebirth: 2019/12/9age: 18interests:- 篮球- 足球- 18animal: [阿猫, 阿狗]score: {english: 80, math: 90}salarys: [9999.98, 9999.99]

2.对象嵌套配置

person:pet:name: 阿狗weight: 99.99allPets:sick:- name: 阿狗weight: 99.99- name: 阿猫weight: 88.88- name: 阿虫weight: 77.77health:- {name: 阿花, weight: 199.99}- {name: 阿花, weight: 199.99}

3.特殊配置说明

图片中显示的配置问题说明:

  1. 字符串引号使用:双引号不会转义特殊字符,单引号会转义
  2. 数组的两种表示法:短横线(-)或方括号([])
  3. Map的两种表示法:花括号({})或多行缩进

四、配置绑定实现

1.实体类定义

@ConfigurationProperties(prefix = "person")
@Component
@Data
@ToString
public class Person {private String userName;private Boolean boss;private Date birth;private Integer age;private Pet pet;private String[] interests;private List<String> animal;private Map<String, Object> score;private Set<Double> salarys;private Map<String, List<Pet>> allPets;
}@Data
@ToString
public class Pet {private String name;private Double weight;
}

2.配置处理器依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

3.构建配置排除

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></exclude></excludes></configuration></plugin></plugins>
</build>

五、最佳实践建议

  1. 复杂配置优先使用YAML格式
  2. 简单配置可以使用Properties格式
  3. 注意YAML的缩进层级关系
  4. 特殊字符使用双引号包裹
  5. 多环境配置使用profile区分
  6. 配置变更后需要重启应用生效

六、常见问题解决

  1. 配置未生效检查点:
  • 检查prefix是否匹配
  • 确认@Component或@EnableConfigurationProperties注解
  • 检查属性名称是否一致
  1. 类型转换错误处理:
  • 确保日期格式正确
  • 数值类型范围匹配
  • 集合类型初始化检查
  1. 复杂对象绑定:
  • 嵌套对象需要正确定义
  • 集合类型需要初始化
  • Map的key应为String类型

总结

Spring Boot配置文件是应用开发中管理参数配置的核心机制,它通过外部化配置实现了应用参数与代码的分离。本文全面对比了Properties和YAML两种主流配置格式的特点与使用场景,为开发者提供了完整的配置解决方案。

在基础语法方面,Properties文件采用传统的键值对格式,通过点号表示层级关系,适合简单配置场景。而YAML文件采用缩进表示层级,支持更丰富的结构表达,能够直观地展现复杂数据结构。对于数组、集合等类型,YAML提供了短横线和方括号两种表示方式,Map类型则可以使用花括号或多行缩进形式,大大提升了复杂配置的可读性。

在配置绑定方面,Spring Boot通过@ConfigurationProperties注解实现了配置到Java对象的自动映射。我们详细展示了如何定义包含基本类型、数组、集合、Map以及嵌套对象等复杂结构的配置类,并特别说明了@ConfigurationProperties注解的prefix属性必须与配置文件前缀严格匹配的要求。同时,通过引入spring-boot-configuration-processor依赖,可以获得配置属性的智能提示和验证功能。

在多环境支持方面,Spring Boot的profile机制允许我们为不同环境创建特定的配置文件,如application-dev.yml和application-prod.yml,通过激活不同的profile实现环境切换。我们还分析了配置加载的优先级顺序,从高到低依次为:命令行参数、JNDI属性、Java系统属性、操作系统环境变量等。

最后,针对实际开发中常见的配置问题,如特殊字符处理、类型转换错误、复杂对象绑定等,提供了具体的解决方案。特别强调了YAML格式在表达复杂数据结构时的优势,以及Properties格式在简单场景下的适用性。

掌握这些配置技巧,开发者可以更高效地管理应用参数,实现配置的灵活切换,提升项目的可维护性。无论是简单的键值配置还是复杂的嵌套对象,Spring Boot都提供了完善的解决方案,帮助开发者专注于业务逻辑的实现。

http://www.lryc.cn/news/619489.html

相关文章:

  • 肖臻《区块链技术与应用》第十一讲:比特币核心概念重温:一文读懂私钥、交易、挖矿与网络现状
  • 模型驱动的自动驾驶AI系统全生命周期安全保障
  • Easysearch 数据迁移之 INFINI Gateway
  • elasticsearch mapping和template解析(自动分词)!
  • LeetCode 刷题【40. 组合总和 II】
  • Linux系统编程Day13 -- 程序地址空间(进阶)
  • 边缘节点 DDoS 防护:CDN 节点的流量清洗与就近拦截方案
  • IPA1299至为芯替代TI ADS1299的脑机接口芯片
  • 机器翻译:学习率调度详解
  • 云蝠智能 VoiceAgent 在不良资产处理中的技术应用与实践
  • 2020/12 JLPT听力原文 问题一 5番
  • 磁悬浮轴承转子动平衡:零接触旋转下的“隐形杀手”深度解析与精准猎杀指南
  • Video_AVI_Packet(1)
  • 部署 Docker 应用详解(MySQL + Tomcat + Nginx + Redis)
  • 1688商品数据抓取:Python爬虫+动态页面解析
  • Visual Studio Code 跨平台快捷键指南:Windows 与 macOS 全面对比
  • VS2022+QT5.15.2+OCCT7.9.1的开发环境搭建流程
  • vscode远程服务器出现一直卡在正在打开远程和连接超时解决办法
  • LaTeX(排版系统)Texlive(环境)Vscode(编辑器)环境配置与安装
  • IV模型(工具变量模型)
  • windows10装Ubuntu22.04系统(双系统)
  • C++中的`if`语句多操作条件执行及顺序保证技术指南
  • 《汇编语言:基于X86处理器》第13章 复习题和编程练习
  • 当GitHub宕机时,我们如何保持高效协作?分布式策略与应急方案详解
  • 内存可见性和伪共享问题
  • 元数据与反射:揭开程序的“自我认知”能力
  • 5.语句几个分类
  • AXIOS 入门
  • 6 ABP 框架中的事件总线与分布式事件
  • 超越相似名称:Elasticsearch semantic text 如何在简洁、高效、集成方面超越 OpenSearch semantic 字段