SpringBoot 配置文件核心用法(Properties & YAML)

SpringBoot 配置文件作用

SpringBoot 定义了规范的配置文件格式,用于集成其他框架,并集中管理项目各类配置信息,典型场景包括:

  • 项目启动端口:自定义服务监听端口
  • 数据库连接信息:包含用户名、密码等
  • 第三方系统调用密钥
  • 日志配置:普通日志、异常日志,用于问题定位与排查

1.关键配置场景说明

  1. 项目启动端口

    • SpringBoot 内置 Tomcat 服务器,默认端口号为 8080
    • 若 8080 端口被其他程序占用,需通过配置文件自定义端口号
  2. 数据库连接信息

    • 持久层框架(如 MyBatis、JPA 等)是对 JDBC 的深层封装
    • 不同应用访问的数据库不同,需通过配置文件自定义数据库连接参数

2.配置文件快速入门

  • SpringBoot 项目创建时,会自动生成配置文件
  • 可通过修改配置文件,更改服务端口号(解决 8080 端口被占用问题)

修改 application.properties ⽂件

复制代码
server.port=9090

显⽰Tomcat启动端⼝号为9090

访问程序:http://127.0.0.1:9090/login.html

此时:http://127.0.0.1:808/login.html 就不能再访问了

3.配置文件的格式

Spring Boot 配置文件有以下三种:

  • application.properties
  • application.yml
  • application.yaml

注意:

properties 优先级比yml. yaml的优先级要高一些

ymlyaml 的简写,实际开发中出现频率最高。yamlyml 的使用方式一样,课堂中只讲 yml 文件的使用。

当应用程序启动时,Spring Boot 会自动从 classpath 路径找到并加载 application.propertiesapplication.yaml 或者 application.yml 文件。

也可以通过 spring.config.name 指定文件路径和名称,参考 https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.files

如下图所示:

3.1配置文件包装类比

类似商品包装,.properties老款包装 (Spring Boot 项目默认格式),.yml新版包装,实际开发中更推荐使用。

3.2特殊说明

  1. 共存与优先级 :理论上 .properties.yml 可共存,启动时都会加载;若配置冲突,.properties 优先级更高
  2. 实践建议:实际业务中建议统一使用一种格式,便于维护、降低故障概率。

注意事项:

重启idea ,会出现有一点小问题

我们重启idea我们会发现,他乱码了,遇到这种情况,我们没有恢复的办法

解决办法:

3.这个只是修改了这个的配置,我们需要修改整个的这个配置文件

4.修改本地的配置

4.properties 配置文件说明

4.1 基本语法
  • 格式:键值对key=value 形式

  • 注释:使用 # 添加注释

  • 示例:

    java 复制代码
    # 配置项目端口号
    server.port=8080
    # 配置数据库连接信息
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
    spring.datasource.username=root
    spring.datasource.password=root
4.2 读取配置文件
  • 方式:使用 @Value 注解,以 ${key} 格式读取

  • 配置示例:

    复制代码
    mykey.key1 = bite
  • 代码示例:

    java 复制代码
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class PropertiesController {
        @Value("${mykey.key1}")
        private String key1;
    
        @RequestMapping("/key")
        public String key(){
            return "读取到值:"+key1;
        }
    }
补充说明
  • @Value 注解可直接注入配置文件中的值到类成员变量。
  • 访问 /key 接口时,会返回配置文件中 mykey.key1 对应的值(如 读取到值:bite)。
@PostConstruct 核心说明
1. 基本定义

@PostConstruct 是 Java EE 中的注解(Spring 也完全支持),作用是:在 Spring 容器创建完 Bean 实例、完成依赖注入后,自动执行标注了这个注解的方法

简单说:Bean 先被创建 → 依赖注入(比如 @Autowired 注入的对象)→ @PostConstruct 方法执行。

  • 初始化数据(比如加载配置、初始化缓存、连接第三方服务);
  • 执行 Bean 创建后的前置操作(依赖注入完成后才能执行,避免空指针)。
二、完整可运行示例
java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

// 普通的Spring Bean
@Component
public class UserService {

    // 依赖注入的对象
    @Autowired
    private ConfigService configService;

    // 空参、无返回值的初始化方法
    @PostConstruct
    public void init() {
        // 此时configService已经完成注入,可安全使用
        String config = configService.getConfig();
        System.out.println("Bean初始化完成,加载配置:" + config);
        // 还可以做缓存初始化、数据预加载等操作
    }
}

// 依赖的ConfigService(示例)
@Component
class ConfigService {
    public String getConfig() {
        return "数据库连接配置:jdbc:mysql://localhost:3306/test";
    }
}
三、关键注意点
  1. 标注的方法必须是:无参数、无返回值(void)、非静态
  2. 执行时机:晚于 @Autowired 依赖注入,早于 Bean 被业务代码使用;
  3. 替代方案:Spring 的 InitializingBean 接口(但 @PostConstruct 更简洁)
4.3 properties 缺点分析

properties 配置是以key-value的形式配置的,如下图所⽰:

从上述配置key看出,properties配置⽂件中会有很多的冗余的信息,⽐如这些:

想要解决这个问题,就可以使⽤yml配置⽂件的格式化了.

5. yml 配置文件说明

yml 是 YAML 的缩写,它的全称是 Yet Another Markup Language,翻译成中文就是 "另一种标记语言"。我们先来学习 yml 的语法。

5.1 yml 基本语法

yml 是树形结构的配置文件,它的基础语法是 "key: value"

  • key 和 value 之间使用英文冒号加空格 的方式组成,空格不可省略
  • 基础语法如下:
1. 基础键值对(核心语法)
java 复制代码
# 正确写法(冒号后必须带空格)
server:
  port: 8080
  host: localhost

# 错误写法(无空格,配置无法解析)
# server:port:8080
2. 数据类型
java 复制代码
# 字符串(默认无需引号,特殊字符需加引号)
name: 张三
nickname: "zhangsan:001"  # 包含特殊符号时加双引号
remark: 'hello\nworld'     # 单引号会转义特殊字符,\n 不会换行

# 数字
age: 20
score: 98.5

# 布尔值
enabled: true
disabled: false

# 空值
empty: null  # 或 ~

# 日期(ISO 8601 格式)
birthday: 2024-03-18
3. 集合 / 数组(两种写法)
java 复制代码
# 写法1:短横线 + 空格(推荐,层级清晰)
user:
  hobbies:
    - 篮球
    - 游泳
    - 编程

# 写法2:中括号简写(单行)
user:
  tags: [Java, SpringBoot, MySQL]
4. 对象 / 嵌套配置
复制代码
# 多层嵌套(SpringBoot 常用)
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456
  redis:
    host: 127.0.0.1
    port: 6379
    timeout: 5000ms
5. 注释规则
复制代码
# 单行注释(仅支持单行,用 # 开头)
server:
  port: 8080  # 端口配置(行内注释也需用 #)
# 多行注释需每行加 #
# 开发环境端口
# 生产环境可改为 80
使用 yml 连接数据库yml

使用示例:

复制代码
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&useSSL=false
    username: root
    password: root

yml 和 properties 连接数据库的配置对比:

5.2 yml 使用进阶

5.2.1 yml 配置不同数据类型及 null
复制代码
# 字符串
string.value: Hello

# 布尔值,true或false
boolean.value: true
boolean.value1: false

# 整数
int.value: 10

# 浮点数
float.value: 3.14159

# Null,~代表null
null.value: ~

# "" 空字符串
#,直接后面什么都不加就可以了,但这种方式不直观,更多的表示是使用引号括起来
empty.value: ''
5.2.1.1 yml 配置读取

yml 读取配置的方式和 properties 相同,使用@Value注解即可,实现代码如下:

yml 配置:

复制代码
string:
  hello: bite

Java 代码:

java 复制代码
@RestController
public class ReadYml {
    @Value("${string.hello}")
    private String hello;

    @RequestMapping("/ymlKey")
    public String key(){
        return "读取到值:"+hello;
    }
}

访问地址: http://127.0.0.1:8080/ymlKey

运行结果:(页面显示:读取到值:bite)

5.2.1.2 注意事项:value 值加单双引号

字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。

尝试在 application.yml 中配置如下信息:

复制代码
string:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."

读取程序实现代码如下:

java 复制代码
@RestController
public class ReadYml {
    @Value("${string.str1}")
    private String str1;

    @Value("${string.str2}")
    private String str2;

    @Value("${string.str3}")
    private String str3;

    @RequestMapping("/yml")
    public String readYml(){
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        return "yml";
    }
}

以上程序的执行结果如下:

复制代码
Hello \n Spring Boot.
Hello \n Spring Boot.
Hello
 Spring Boot.

从上述结果可以看出:

  • 字符串默认不用加上单引号或者双引号。
  • 单引号会转义特殊字符,使其失去特殊功能,始终是一个普通的字符串。
  • 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义。

此处的转义理解起来会有些拗口,\n 本意表示的是换行:

  • 使用单引号会转义,\n 不再表示换行,而是表示一个普通的字符串。
  • 使用双引号不会转义,\n 表示的是它本身的含义,就是换行。

JavaEE 的学习重在理解和使用,不纠结概念和描述

想要快速赋值:value

5.2.2 配置对象

我们还可以在 yml 中配置对象,如下配置:

复制代码
student:
  id: 1
  name: Java
  age: 18

或者是使用行内写法(与上面的写法作用一致):

复制代码
student: {id: 1,name: Java,age: 18}

这个时候就不能用 @Value 来读取配置中的对象了,此时要使用另一个注解 @ConfigurationProperties 来读取,具体实现如下:

java 复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
    private int id;
    private String name;
    private int age;
}

调用类的实现如下:

java 复制代码
@RestController
public class StudentController {
    @Autowired
    private Student student;

    @RequestMapping("/readStudent")
    public String readStudent(){
        return student.toString();
    }
}

访问地址:http://127.0.0.1:8080/readStudent

5.2.3 配置集合

配置文件也可以配置 list 集合,如下所示:

复制代码
dbtypes:
  name:
    - mysql
    - sqlserver
    - db2

集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的,具体实现如下:

java 复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
    private List<String> name;
}

访问集合的实现如下:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ReadYml2 {
    @Autowired
    private ListConfig listConfig;

    @RequestMapping("/readList")
    public String readList() {
        return listConfig.toString();
    }
}

5.2.4 配置 Map

配置文件也可以配置 map,如下所示:

复制代码
maptypes:
  map:
    k1: kk1
    k2: kk2
    k3: kk3

或者是使用行内写法(与上面的写法作用一致):

复制代码
maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}

Map 的读取和对象一样,也是使用 @ConfigurationProperties 来读取的,具体实现如下:

java 复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.HashMap;

@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
    private HashMap<String,String> map;
}

打印类的实现

java

运行

复制代码
@RestController
public class ReadYml2 {
    @Autowired
    private MapConfig mapConfig;

    @RequestMapping("/readMap")
    public String readStudent() {
        return mapConfig.toString();
    }
}

5.3 yml 优缺点

优点
  1. 可读性高,写法简单,易于理解
  2. 支持更多的数据类型,可以简单表达对象、数组、List、Map 等数据形态
  3. 支持更多的编程语言,不止是 Java 中可以使用,在 Golang、Python、Ruby、JavaScript 中也可以使用
缺点
  1. 不适合写复杂的配置文件

    • 比如 properties 格式如下:

      java 复制代码
      keycloak.realm = demo
      keycloak.resource = fm-cache-cloud
      keycloak.credentials.secret = d4589683-0ce7-4982-bcd3
      keycloak.security[0].authRoles[0] = user
      keycloak.security[0].collections[0].name = ssologinurl
      keycloak.security[0].collections[0].patterns[0] = /login/*
    • 转换为 yml:

      java 复制代码
      keycloak:
        realm: demo
        resource: fm-cache-cloud
        credentials:
          secret: d4589683-0ce7-4982-bcd3
        security:
          - authRoles:
              - user
            collections:
              - name: ssologinurl
                patterns:
                  - /login/*
    • 转换的过程也比较花费精力,如果配置更复杂一点,可读性会更差,代码也会更难写

  2. 对格式有较强的要求(一个空格可能会引起一场血案)

相关推荐
devlei6 小时前
从源码泄露看AI Agent未来:深度对比Claude Code原生实现与OpenClaw开源方案
android·前端·后端
pshdhx_albert6 小时前
AI agent实现打字机效果
java·http·ai编程
沉鱼.447 小时前
第十二届题目
java·前端·算法
努力的小郑8 小时前
Canal 不难,难的是用好:从接入到治理
后端·mysql·性能优化
赫瑞8 小时前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
Victor3568 小时前
MongoDB(87)如何使用GridFS?
后端
Victor3568 小时前
MongoDB(88)如何进行数据迁移?
后端
小红的布丁9 小时前
单线程 Redis 的高性能之道
redis·后端
GetcharZp9 小时前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
周末也要写八哥9 小时前
多进程和多线程的特点和区别
java·开发语言·jvm