Spring学习日记——DAY03(yml文件)

今天针对 SpringBoot 的YAML 配置文件功能展开了学习,学习内容如下:

我们在使用 SpringBoot 传统配置:使用.properties文件,格式冗余、层级不清晰,大量重复前缀需要手动编写

使用 XML 配置:标签繁琐、结构冗长,配置数据不够直观

使用SpringBoot YAML:以数据为中心,语法简洁、层级清晰,完美替代 properties 与 XML,是 SpringBoot 官方推荐的配置格式


1. YAML 相关语法介绍

1.1 基本语法规则

  • 大小写敏感
  • 使用空格缩进表示层级关系
  • key 与 value 之间必须加空格
  • 字符串默认不加引号,特殊字符需用双引号
  • 支持字面值、对象、数组、复合结构

1.2 支持数据类型

  1. 字面值:普通值(数字、字符串、布尔、日期)
  2. 对象:键值对集合
  3. 数组 / List/Set :用-表示
  4. Map:键值对格式

1.3 YAML 松弛绑定规则

SpringBoot 采用宽松绑定,以下写法均可映射到userName

  • user-name: 张三(烤肉串风格,推荐)
  • userName: 张三(驼峰)
  • user_name: 张三(下划线)
  • USER_NAME: 张三(大写,环境变量推荐)

1.4 多环境配置

命名规范:application-{profile}.yml

  • 开发:application-dev.yml

  • 测试:application-test.yml

  • 生产:application-prod.yml

    spring:
    profiles:
    active: dev


2. 实战

我们使用 YAML 完成:基础值配置、对象配置、集合配置、多环境切换、配置绑定实战。

2.1 引入依赖(配置绑定需要)

xml

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

2.2 YAML 配置文件

application.yml

复制代码
# 基础字面值
sysUser: 张三
age: 20
money: 123.45
birth: 1999/12/12

# 对象配置
com:
  xzit:
    model:
      users:
        name: 李四
        gender: 男
        age: 22
        money: 234.22
        birth: 1999/12/23

# 集合
likes:
  - 打球
  - 游泳
  - 游戏

list: [aa, bb, cc]
map:
  k1: v1
  k2: v2

# 引用与随机值
server:
  port: 8080
users:
  customer:
    url: localhost:${server.port}

teacher:
  id: ${random.uuid}
  age: ${random.int(30,50)}

2.3 实体类(YAML 绑定)

复制代码
package com.xzit.model;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.time.LocalDate;

@Data
@Component
@ConfigurationProperties(prefix = "com.xzit.model.users")
public class Users {
    private String name;
    private String gender;
    private int age;
    private double money;
    private LocalDate birth;
}

2.4 Controller 测试读取

方式 1:@Value 读取单个值
复制代码
package com.xzit.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;

@RestController
public class TestController {
    @Value("${sysUser}")
    private String sysUser;
    @Value("${age}")
    private int age;
    @Value("${money}")
    private double money;
    @Value("${birth}")
    private Date birth;

    @GetMapping("/show")
    public Object show(){
        return sysUser + " | " + age + " | " + money + " | " + birth;
    }
}
方式 2:绑定对象
复制代码
package com.xzit.controller;

import com.xzit.model.Users;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

@RestController
public class UsersController {
    @Resource
    private Users user;

    @GetMapping("/user")
    public Object showYaml(){
        return user;
    }
}
方式 3:Environment 读取
复制代码
@Resource
private Environment env;

@GetMapping("/env")
public Object env(){
    return env.getProperty("sysUser") 
            + " | " + env.getProperty("com.xzit.model.users.name");
}

2.5 多环境配置演示

application-dev.yml

复制代码
server:
  port: 8080

application-prod.yml

复制代码
server:
  port: 8081

主配置激活:

复制代码
spring:
  profiles:
    active: dev

3. YAML 常用功能总结

3.1 配置文件优先级

  1. file:./config/
  2. file:./
  3. classpath:/config/
  4. classpath:/

3.2 自动重启排除配置

yaml

复制代码
spring:
  devtools:
    restart:
      exclude: static/**,public/**,templates/**

3.3 自定义配置文件名

启动参数指定:

plaintext

复制代码
java -jar xxx.jar --spring.config.name=myconfig
相关推荐
2601_96733871几秒前
尚硅谷2026尚硅谷Java全栈+Python智能体教程
java·人工智能
摇滚侠10 分钟前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发进阶 阅读笔记 24
spring boot·笔记·后端
摇滚侠18 分钟前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 22
javascript·spring boot·笔记
孙克旭_25 分钟前
单链表进阶实操:5 道常考面试题详细解析【Java 实现】
java·开发语言·数据结构·单链表
2601_9619017031 分钟前
SpringCloud2023集成Nacos2.4.3
java
玄昌盛不会编程32 分钟前
LeetCode——2091. 从数组中移除最大值和最小值
java·算法·leetcode
Rain的Java大神之路35 分钟前
如何保证接口幂等
java·经验分享·后端·面试·架构
吴声子夜歌36 分钟前
Java——数组和集合(一)
java·开发语言
Jesse_EC38 分钟前
一个看不见的字符——CRLF 如何让我的 Docker 初始化脚本"静默失踪"
java·后端
深念Y38 分钟前
Nuxt 项目 Docker 构建:从 pnpm+node 迁移到全 bun
java·前端·docker