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

 更新时间:2026年03月20日 09:50:07   作者:Han.miracle  
这篇文章给大家介绍了SpringBoot 配置文件核心用法(Properties & YAML)详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

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

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

1.关键配置场景说明

  • 项目启动端口
    • SpringBoot 内置 Tomcat 服务器,默认端口号为 8080
    • 若 8080 端口被其他程序占用,需通过配置文件自定义端口号
  • 数据库连接信息
    • 持久层框架(如 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我们会发现,他乱码了,遇到这种情况,我们没有恢复的办法

解决办法:

1.

2.

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

4.修改本地的配置

4.properties 配置文件说明

4.1 基本语法

  • 格式:键值对key=value 形式
  • 注释:使用 # 添加注释
  • 示例:
# 配置项目端口号
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
  • 代码示例:
    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 创建后的前置操作(依赖注入完成后才能执行,避免空指针)。

二、完整可运行示例

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. 基础键值对(核心语法)

# 正确写法(冒号后必须带空格)
server:
  port: 8080
  host: localhost
# 错误写法(无空格,配置无法解析)
# server:port:8080

2. 数据类型

# 字符串(默认无需引号,特殊字符需加引号)
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. 集合 / 数组(两种写法)

# 写法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 代码:

@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."

读取程序实现代码如下:

@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 来读取,具体实现如下:

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;
}

调用类的实现如下:

@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 来读取的,具体实现如下:

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;
}

访问集合的实现如下:

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 来读取的,具体实现如下:

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;
}

打印类的实现

@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 中也可以使用

缺点

不适合写复杂的配置文件

比如 properties 格式如下:

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:

keycloak:
  realm: demo
  resource: fm-cache-cloud
  credentials:
    secret: d4589683-0ce7-4982-bcd3
  security:
    - authRoles:
        - user
      collections:
        - name: ssologinurl
          patterns:
            - /login/*

转换的过程也比较花费精力,如果配置更复杂一点,可读性会更差,代码也会更难写

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

到此这篇关于SpringBoot 配置文件核心用法(Properties &amp; YAML)详解的文章就介绍到这了,更多相关SpringBoot 配置文件用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中线程组ThreadGroup与线程池的区别及示例

    Java中线程组ThreadGroup与线程池的区别及示例

    这篇文章主要介绍了Java中线程组与线程池的区别及示例,ThreadGroup是用来管理一组线程的,可以控制线程的执行,查看线程的执行状态等操作,方便对于一组线程的统一管理,需要的朋友可以参考下
    2023-05-05
  • springmvc级联属性处理无法转换异常问题解决

    springmvc级联属性处理无法转换异常问题解决

    这篇文章主要介绍了springmvc级联属性处理无法转换异常问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 浅析Spring Validation参数校验的实现原理与进阶用法

    浅析Spring Validation参数校验的实现原理与进阶用法

    这篇文章主要介绍了Spring Validation参数校验的实现原理与进阶用法,本文展示了分组校验,嵌套校验,集合校验等进阶功能,并提供了自定义校验注解的实现方法,希望对大家有所帮助
    2026-01-01
  • Java软件设计模式之适配器模式详解

    Java软件设计模式之适配器模式详解

    这篇文章主要介绍了Java软件设计模式之适配器模式详解,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系,需要的朋友可以参考下
    2023-07-07
  • Spring Boot 2.0快速构建服务组件全步骤

    Spring Boot 2.0快速构建服务组件全步骤

    这篇文章主要给大家介绍了关于Spring Boot 2.0快速构建服务组件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot 2.0具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 超详细讲解Java秒杀项目登陆模块的实现

    超详细讲解Java秒杀项目登陆模块的实现

    这是一个主要使用java开发的秒杀系统,项目比较大,所以本篇只实现了登陆模块,代码非常详尽,感兴趣的朋友快来看看
    2022-03-03
  • RestTemplate返回值中文乱码问题

    RestTemplate返回值中文乱码问题

    这篇文章主要介绍了RestTemplate返回值中文乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Spring工程中集成多个redis数据源的思路详解

    Spring工程中集成多个redis数据源的思路详解

    Spring项目集成双Redis数据源需配置两个连接工厂与RedisTemplate,通过@Primary指定默认Bean,@Qualifier注入特定Bean,支持集群环境,本文给大家介绍Spring工程中集成多个redis数据源的相关知识,感兴趣的朋友一起看看吧
    2025-07-07
  • 使用 Java8 实现观察者模式的方法(下)

    使用 Java8 实现观察者模式的方法(下)

    这篇文章主要介绍了使用 Java8 实现观察者模式的方法(下)的相关资料,需要的朋友可以参考下
    2016-02-02
  • 从简单到进阶解析Java调用Python的5种实用方案

    从简单到进阶解析Java调用Python的5种实用方案

    在机器学习与大数据融合的今天,Java与Python的协同开发已成为企业级应用的常见需求,本文将通过真实案例解析5种主流调用方案,需要的小伙伴可以了解下
    2025-09-09

最新评论