Spring Boot,两种配置文件

news2025/6/3 13:48:04

Spring Boot 主要支持两种配置文件格式,它们允许你外部化应用程序的配置:.properties 文件和 .yml (或 .yaml) 文件。以下是关于这两种配置文件的关键知识点:


1. application.properties 文件

  • 格式: 基于键值对的纯文本文件。
    • 语法: key=value
    • 每一行通常表示一个配置项。
    • 可以使用 #! 作为注释行的开头。
  • 层级结构: 使用点 (.)符号来表示属性的层级关系。
    • 例如: spring.datasource.url=jdbc:mysql://localhost/mydb
  • 列表/数组: 可以通过在键名后使用方括号 [] 和索引来表示列表。
    • 例如:
      my.list[0]=apple
      my.list[1]=banana
      
  • 可读性: 对于简单的配置,可读性尚可。但对于复杂或嵌套层级较深的配置,可能会显得冗长且不易阅读。
  • 特殊字符: 需要对某些特殊字符进行转义 (例如,:= 在值中出现时)。
  • 编码: 默认使用 ISO-8859-1 编码,如果需要使用其他编码(如UTF-8以支持中文),需要IDE或编辑器正确处理。

2. application.yml (或 application.yaml) 文件

  • 格式: YAML (YAML Ain’t Markup Language),是一种人类可读的数据序列化标准。
    • 语法: 使用缩进来表示层级关系和结构(通常是2个空格,不允许使用制表符 Tab)。
    • 键值对使用冒号 (:) 分隔:key: value (冒号后通常有一个空格)。
  • 层级结构: 通过缩进自然地表达层级。
    • 例如:
      spring:
        datasource:
          url: jdbc:mysql://localhost/mydb
      
  • 列表/数组: 使用连字符 (-) 开头表示列表项。
    • 例如:
      my:
        list:
          - apple
          - banana
      
    • 也可以内联表示: my.anotherlist: [orange, grape]
  • 可读性: 对于复杂和嵌套的配置数据,YAML 通常比 .properties 文件更简洁、更易读。
  • 数据类型: 更直观地支持布尔值 (true/false), 数字, 字符串 (通常不需要引号,除非包含特殊字符或为了清晰)。
  • 多文档支持: 一个 YAML 文件可以通过 --- 分隔符包含多个文档,这在Spring Boot中常用于定义不同Profile的配置于同一个文件中。

通用关键知识点 (适用于两者)

  • 默认文件名: Spring Boot 会自动加载位于 src/main/resources 目录下的 application.propertiesapplication.yml 文件。
  • 加载优先级:
    • 如果在同一目录下同时存在 application.propertiesapplication.yml.properties 文件中的配置会覆盖 .yml 文件中的配置
    • Spring Boot 有一个详细的外部化配置加载顺序(包括命令行参数、环境变量、不同目录下的配置文件等),src/main/resources 下的这些文件是其中的一部分。
  • Spring Profiles:
    • 两种格式都支持通过特定的命名约定为不同的环境(如开发、测试、生产)定义不同的配置。
      • .properties: application-{profile}.properties (例如: application-dev.properties)
      • .yml: application-{profile}.yml (例如: application-prod.yml)
      • 也可以在单个 application.yml 文件中使用 --- 分隔并结合 spring.config.activate.on-profile (较新版本) 或 spring.profiles (较旧版本,不推荐用于多文档激活) 来指定不同profile的配置块。
    • 通过 spring.profiles.active 属性来激活一个或多个profile。
  • 属性覆盖: 高优先级的配置源可以覆盖低优先级的配置源。例如,命令行参数可以覆盖配置文件中的属性。
  • 占位符 (Placeholders): 可以在配置文件中使用 ${...} 形式的占位符来引用其他属性的值,或者系统属性、环境变量等。
    • 例如: app.description=${app.name} is a Spring Boot application
  • 配置绑定 (@ConfigurationProperties, @Value):
    • Spring Boot 提供了强大的机制将配置文件中的属性值绑定到Java对象的字段上。
      • @Value("${my.property}") 用于注入单个属性值。
      • @ConfigurationProperties(prefix = "my.config") 用于将一组属性绑定到一个POJO类。
  • Relaxed Binding (宽松绑定): Spring Boot 在将环境变量或配置文件中的属性绑定到 @ConfigurationProperties Bean时,支持多种命名方式的匹配 (例如,my.property-name 可以匹配 MY_PROPERTY_NAME 环境变量或 myPropertyName Java Bean属性)。
  • 位置: 除了 src/main/resources,Spring Boot 还会从其他位置加载配置文件,例如:
    • 当前目录下的 /config 子目录
    • 当前目录
    • 类路径下的 /config
    • 类路径根目录 (src/main/resources)

选择与总结

  • 简洁性与复杂配置: YAML 通常因其在处理复杂、层级化配置时的简洁性和可读性而受到青睐。
  • 团队偏好: 选择哪种格式很多时候取决于团队的熟悉程度和偏好。
  • Spring Boot的灵活性: Spring Boot 对两种格式都提供了一流的支持,可以根据项目需求灵活选择或甚至混合使用(尽管不常见)。

理解这些关键点有助于更有效地管理和维护Spring Boot应用程序的配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2395716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式——简单工厂模式(创建型)

摘要 本文主要介绍了简单工厂模式,包括其定义、结构、实现方式、适用场景、实战示例以及思考。简单工厂模式是一种创建型设计模式,通过工厂类根据参数决定创建哪一种产品类的实例,封装了对象创建的细节,使客户端无需关心具体类的…

qt ubuntu 20.04 交叉编译

一、交叉编译环境搭建 1.下载交叉编译工具链:https://developer.arm.com/downloads/-/gnu-a 可以根据自己需要下载对应版本,当前最新版本是10.3, 笔者使用10.3编译后的glibc.so版本太高(glibc_2.3.3, glibc_2.3.4, glibc_2.3.5)…

晶振频率稳定性:5G 基站与航天设备的核心竞争力

在当今科技飞速发展的时代,电子设备的性能和可靠性至关重要。晶振作为电子设备中的核心部件,为系统提供精确的时间和频率基准。晶振的频率稳定性直接影响着设备的整体性能,从日常生活中广泛使用的智能手机、智能穿戴设备,到对精度…

基于python脚本进行Maxwell自动化仿真

本文为博主进行Maxwell自动化研究过程的学习记录,同时对Maxwell自动化脚本(pythonIron)实现方法进行分享。 文章目录 脚本使用方法脚本录制与查看常用脚本代码通用开头定义项目调整设计变量软件内对应位置脚本 设置求解器软件内对应位置脚本…

Blueprints - List View Widget

一些学习笔记归档; 需要读取动态数据把多个条目显示在UI上的时候,可能用到List View组件;假如有Widget要使用在List View中,此Widget需要继承相关接口: 这样就能在List View控件中选择已经继承接口的Widget组件了&…

docker-compose搭建prometheus以及grafana

1. 什么是 Prometheus? Prometheus 是一个开源的系统监控和告警工具,由 SoundCloud 于 2012 年开始开发,现为 CNCF(Cloud Native Computing Foundation)项目之一。它特别适合云原生环境和容器编排系统(如 …

多线程和并发之线程

线程 前面讲到进程:为了并发执行任务(程序),现代操作系统才引进进程的概念 分析: 创建开销问题:创建一个进程开销:大 子进程需要拷贝父进程的整个地址空间 通信开销问题:进程间的通…

apptrace 的优势以及对 App 的价值

官网地址:AppTrace - 专业的移动应用推广追踪平台 apptrace 的优势以及对 App 的价值​ App 拉起作为移动端深度链接技术的关键应用,能实现从 H5 网页到 App 的无缝跳转,并精准定位到 App 内指定页面。apptrace 凭借专业的技术与丰富的经验…

android studio debug调试出现 IOException异常

解决Android调试端口无法打开的问题,出现"Unable to open debugger port"错误时,可以进入app设置,选择Debugger选项,将Debug type更改为Java Only模式。这个方法适用于Android Studio调试时遇到的端口连接问题&#xff…

vr中风--数据处理模型搭建与训练

# -*- coding: utf-8 -*- """ MUSED-I康复评估系统(增强版) 包含:多通道sEMG数据增强、混合模型架构、标准化处理 """ import numpy as np import pandas as pd from sklearn.model_selection import train_te…

前端学习(7)—— HTML + CSS实现博客系统页面

目录 一,效果展示 二,实现博客列表页 2.1 实现导航栏 2.2 实现个人信息 2.3 实现博客列表 三,实现博客正文页 3.2 复用 3.4 实现博客正文 四,实现博客登录页 4.1 版心 4.2 登录框 五,实现博客编辑页 5.1 …

RuoYi前后端分离框架实现前后端数据传输加密(二)之前端篇

一、背景 本文是RuoYi前后端分离框架实现前后端数据传输加密(一)之后端篇文章配套的,主要介绍前端对自定义字段传输加密的实现,两篇文章结合可以完整的完成RuoYi前后端分离框架对API通信过程中实现自定义字段加密传输。前端的加解密实现,不涉及到界面的修改,仅仅是方法的…

基于视觉的车道线检测完整代码:让驾驶更安全的开源解决方案

基于视觉的车道线检测完整代码:让驾驶更安全的开源解决方案 【下载地址】基于视觉的车道线检测完整代码 这是一个基于视觉的车道线检测开源项目,提供完整的代码示例,采用滑动窗口算法实现。项目通过逐行扫描图像,精准识别曲线车道…

鸿蒙仓颉开发语言实战教程:自定义tabbar

大家周末好呀,今天继续分享仓颉语言开发商城应用的实战教程,今天要做的是tabbar。 大家都知道ArkTs有Tabs和TabContent容器,能够实现上图的样式,满足基本的使用需求。而仓颉就不同了,它虽然也有这两个组件,…

28 C 语言作用域详解:作用域特性(全局、局部、块级)、应用场景、注意事项

1 作用域简介 作用域定义了代码中标识符(如变量、常量、数组、函数等)的可见性与可访问范围,即标识符在程序的哪些位置能够被引用或访问。在 C 语言中,作用域主要分为三类: 全局作用域局部作用域块级作用域 需注意&am…

MySQL 事务解析

1. 事务简介 事务(Transaction) 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 经典案例&#xff1…

题海拾贝:压缩字符串

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

振动力学的三类基本问题

振动问题的分类依赖于分类的出发点&#xff0c;本文从系统论的角度来分析振动问题的分类。如图1&#xff0c;一个振动系统&#xff0c;包括三个方面&#xff1a;输入、系统特性&#xff08;或称为系统模型&#xff09;、输出。其中&#xff0c;输入指外界载荷&#xff0c;包括力…

移动端 UI自动化测试学习之Appium框架(包含adb调试工具介绍)

文章目录 前言adb调试工具adb组成常用命令获取程序的包名和界面名文件传输发送文件到手机从手机中拉取文件 获取app启动时间获取手机日志其他命令 Appium 简介工作原理图 环境搭建安装客户端库&#xff08;appium lib&#xff09;安装Appium Server安装JDK&#xff08;自行下载…

CS144 - Lecture 2

CS144 - Lecture 1 TCP 这里就简单讲了一下它的基本性质&#xff0c;没啥好说的 UDP 提供不可靠的传输服务&#xff0c;我们的 DNS 服务和 DHCP 都是用的 UDP 协议。 对于 DNS 我们只是单纯地向 DNS 服务器发送域名&#xff0c;然后返回一个 IP&#xff0c;如果还需要建立…