【Spring】 SpringBoot 配置文件

SpringBoot 配置文件

properties

properties 基础语法

properties 文件是 SpringBoot 中一种常用的配置文件格式,其核心语法为 key=value

properties 复制代码
# 基本格式
key=value

# 使用 . 进行层级分隔
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456

# 自定义配置
my.key=hello
my.name=SpringBoot

数据库配置示例

properties 复制代码
# 数据库连接配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456

# 连接池配置
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.idle-timeout=30000

读取 properties 信息

方式一:使用 @Value 注解

java 复制代码
@Component
@Date
public class MyConfig {
    
    @Value("${my.key}")
    private String myKey;
    
    @Value("${my.name}")
    private String myName;
    
}

方式二:使用 @ConfigurationProperties 注解

java 复制代码
@Component
@ConfigurationProperties(prefix = "my")
public class MyProperties {
    
    private String key;
    private String name;
    
    // getter 和 setter 方法
}

注意@Value 适合读取单个配置值,@ConfigurationProperties 适合批量绑定一组配置到对象。

读取类型与存入类型

SpringBoot 在读取 properties 配置文件时,会自动将字符串值转换为目标类型。因为Spring内置了 类型转换器(Converter) 机制,会自动完成以下转换:

  1. 基本类型及其包装类intlongdoubleboolean 等自动转换
  2. 日期时间类型 :支持 DateLocalDateLocalDateTime
  3. 枚举类型:支持字符串到枚举的自动转换
  4. 自定义类型 :可通过实现 Converter 接口自定义转换规则
注意事项
  • 类型不匹配时 :如果配置值无法转换为目标类型,SpringBoot 会抛出 IllegalArgumentException
  • 空值处理 :配置值为空字符串时,基本类型会使用默认值(如 int 为 0),包装类型为 null
  • 日期格式 :日期类型默认使用 ISO 格式(yyyy-MM-dd),可通过 @DateTimeFormat 注解自定义格式
java 复制代码
@Component
public class TypeDemoConfig {
    
    @Value("${my.age}")
    private int age;  // "25" → 25
    
    @Value("${my.price}")
    private double price;  // "19.99" → 19.99
    
    @Value("${my.enabled}")
    private boolean enabled;  // "true" → true
    
    @Value("${my.name}")
    private String name;  // 直接作为字符串
    
    @Value("${my.date}")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate date;  // "2024-01-15" → 2024-01-15
}

properties 优缺点

优点

  • 语法简单key=value 格式,易于理解和使用
  • 兼容性好:Java 原生支持的配置文件格式
  • 优先级高:与 yml 同时存在时,properties 优先级更高

缺点

  • 冗余较多 :层级结构需要重复写前缀,如 spring.datasource.url
  • 不支持复杂类型:难以直接表达数组、集合、Map 等复杂数据结构
  • 编码问题:默认使用 ISO-8859-1 编码,中文需要转义

yml

yml 基础语法

YAML(YAML Ain't Markup Language)是一种以数据为中心的配置文件格式,SpringBoot 推荐使用 application.yml 作为配置文件。其核心语法规则如下:

基本格式

yaml 复制代码
key: value

注意:冒号后面必须有一个空格,否则解析会失败。

层级结构(缩进)

YAML 使用缩进表示层级关系,推荐使用 2 个空格缩进(不支持 Tab):

yaml 复制代码
server:
  port: 8080
  servlet:
    context-path: /api

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456

常见数据类型

字符串

yaml 复制代码
# 普通字符串(可不加引号)
name: 张三

# 带特殊字符时建议加引号
title: "Hello: World"

# 单引号不会转义特殊字符,双引号会转义
message1: 'Hello\nWorld'   # 原样输出 Hello\nWorld
message2: "Hello\nWorld"   # 换行输出 Hello World

数值类型

yaml 复制代码
age: 25                # 整数
price: 19.99           # 浮点数
count: 1_000_000       # 支持下划线分隔(Java 8+)

布尔类型

yaml 复制代码
enabled: true          # true / false
debug: false

null 值

yaml 复制代码
# 使用 ~ 或留空表示 null
value: ~               # 表示 null
emptyValue:            # 留空也表示 null

空字符串

yaml 复制代码
# 使用单引号或双引号包裹空字符串
empty: ''
blank: ""

复杂数据结构

定义对象(Map)

yaml 复制代码
# 方式一:缩进写法
my:
  key: hello
  name: SpringBoot
  age: 25

# 方式二:行内写法(JSON 风格)
my: {key: hello, name: SpringBoot, age: 25}

定义数组 / 集合(List)

yaml 复制代码
# 方式一:缩进写法(使用 - )
hobbies:
  - 读书
  - 编程
  - 运动

# 方式二:行内写法
hobbies: [读书, 编程, 运动]

定义对象数组

yaml 复制代码
users:
  - name: 张三
    age: 25
  - name: 李四
    age: 30

# 行内写法
users: [{name: 张三, age: 25}, {name: 李四, age: 30}]

多文档块(---)

使用 --- 分隔多个 YAML 文档,常用于多环境配置:

yaml 复制代码
# 默认配置
server:
  port: 8080
---
# 开发环境配置
spring:
  config:
    activate:
      on-profile: dev
server:
  port: 8081
---
# 生产环境配置
spring:
  config:
    activate:
      on-profile: prod
server:
  port: 8080

锚点与引用(& 和 *)

YAML 支持锚点(&)和引用(*)来复用配置:

yaml 复制代码
# 定义默认配置
default: &default
  timeout: 5000
  retry: 3

# 引用默认配置并覆盖部分属性
service1:
  <<: *default
  url: http://service1.com

service2:
  <<: *default
  url: http://service2.com
  timeout: 10000  # 覆盖默认值

读取 yml 信息

SpringBoot 读取 yml 配置文件的方式与读取 properties 完全一致,同样支持 @Value 注解和 @ConfigurationProperties 注解两种方式。

方式一:使用 @Value 注解

java 复制代码
@Component
public class YmlConfig {
    
    @Value("${my.name}")
    private String myName;
    
    @Value("${my.age}")
    private int myAge;
    
    @Value("${my.enabled}")
    private boolean enabled;
    
    @Value("${my.price}")
    private double price;
    
    @Value("${my.hobbies}")
    private String[] hobbies;
}

方式二:使用 @ConfigurationProperties 注解

java 复制代码
@Component
@ConfigurationProperties(prefix = "my")
public class YmlProperties {
    
    private String name;
    private int age;
    private boolean enabled;
    private double price;
    private List<String> hobbies;
    private Map<String, String> config;
}

properties 和 yml 对比

SpringBoot 同时支持 application.propertiesapplication.yml 两种配置文件格式,开发者可以根据项目需求选择使用。下面从多个维度进行对比分析。

加载机制

SpringBoot 在启动时会按以下顺序加载配置文件:

  1. 默认位置classpath:/(即 resources/ 目录下)
  2. 文件名application.propertiesapplication.yml
  3. 多环境配置application-{profile}.propertiesapplication-{profile}.yml

优先级规则

propertiesyml 两种配置文件同时存在时,遵循以下规则:

规则 说明
同时生效 两个配置文件都会被加载,配置项取并集
冲突处理 如果两个文件中存在相同的配置项 ,以 properties 文件中的值为准
加载顺序 SpringBoot 先加载 yml,再加载 properties,后者覆盖前者

语法对比

对比维度 properties yml
语法格式 key=value key: value(缩进表示层级)
层级表达 使用 . 分隔,如 spring.datasource.url 使用缩进,层级清晰
冗余度 层级越深,前缀重复越多 缩进结构,无重复前缀
数组/集合 不支持原生表达,需用 [0][1] 下标 原生支持 - 列表语法
Map 结构 不支持原生表达 原生支持缩进或行内 Map
多环境配置 通过 application-{profile}.properties 通过 --- 多文档块或 application-{profile}.yml
编码 默认 ISO-8859-1,中文需转义 默认 UTF-8,原生支持中文

yml 优缺点

优点

  1. 可读性强

    YAML 使用缩进表示层级关系,结构清晰直观,比 properties 的 key=value 格式更易阅读和维护,尤其适合配置项较多的场景。

  2. 支持复杂数据结构

    原生支持数组、集合、Map、对象嵌套等复杂数据类型,无需像 properties 那样使用下标或特殊约定。

  3. 层级简洁无冗余

    通过缩进表达层级,避免了 properties 中重复书写前缀的问题。

  4. UTF-8 编码支持

    默认使用 UTF-8 编码,原生支持中文,无需像 properties 那样对中文进行 Unicode 转义。

  5. 多文档块支持

    使用 --- 分隔符可以在一个文件中管理多套环境的配置,减少文件数量。

  6. 锚点与引用

    支持 &* 语法复用配置,减少重复代码。

缺点

  1. 对缩进敏感
    缩进错误会导致解析失败或配置读取异常,且不支持 Tab 键(必须使用空格),对新手不够友好。
yaml 复制代码
# 错误示例:缩进不一致
server:
  port: 8080
    servlet:       # 缩进多了,解析会报错
    context-path: /api
  1. 不适合简单配置

    如果只有几个配置项,使用 yml 反而显得「杀鸡用牛刀」,properties 的 key=value 更直接。

  2. 调试相对困难

    yml 的解析错误信息有时不够直观,定位缩进问题需要逐行检查。

  3. 优先级低于 properties

    当 properties 和 yml 同时存在且配置冲突时,以 properties 为准,yml 的配置会被覆盖。

  4. 不支持复杂表达式

    properties 可以通过 ${...} 引用其他配置值,yml 虽然也支持,但在某些复杂场景下不如 properties 灵活。

相关推荐
那小子、真烦1 小时前
Hermes Agent Chat 方法分析
java·开发语言
01_ice2 小时前
Java抽象类和接口
java·开发语言
小马爱打代码2 小时前
Spring源码 第七篇:Spring Boot 自动配置原理深度拆解
java·spring boot·spring
日取其半万世不竭2 小时前
给 Docker 容器设置 CPU 和内存限制,避免单个服务拖垮整机
java·docker·容器
铁皮哥2 小时前
【agent 开发】Claude Code 的 Skill 是怎么被加载的?从 name/description 到 SKILL.md 再到资源文件
java·服务器·数据库·python·gitee·github·软件工程
白宇横流学长2 小时前
基于SpringBoot实现的校园失物招领平台设计与实现【源码+文档】
java·spring boot·后端
罗超驿2 小时前
6.Java多线程详解:Thread类、线程属性与start()方法深度解析
java·开发语言·面试·java-ee
苦逼的猿宝2 小时前
IT技术交流和分享平台的设计与实现(源码+论文)
java·毕业设计·springboot·计算机毕业设计
摇滚侠2 小时前
IDEA 需要修改的配置 开发工具
java·ide·intellij-idea