开篇:为什么配置是 SpringBoot 的 “开关”?
你有没有想过:SpringBoot 的内置 Tomcat 默认端口是 8080,怎么改成 80?连接 MySQL 时,数据库地址、账号密码写在哪?这些 “自定义设置” 全靠配置文件实现。
SpringBoot 的配置就像 “家电遥控器”—— 不用拆开机箱(改源码),按几个键(改配置)就能调整功能。

一、基础:3 种配置文件类型,选 yml 就对了

配置的重要性与类型
在SpringBoot项目中,配置是连接代码和运行环境的桥梁。主要配置分为两类:

  • 三方技术配置:如Redis、MyBatis、数据库连接等
  • 自定义配置:应用特定的参数和设置

配置文件格式与优先级

SpringBoot支持三种配置文件格式,按优先级从高到低排列:

1. 3 种配置文件对比(附写法示例)

类型 文件名 语法风格 优点 缺点 推荐度
Properties application.properties 键值对(key=value) 写法简单,兼容性强 层级多时空格多,可读性差 ★★☆
YAML application.yml 缩进层级(key: value) 层级清晰,可读性强(主流) 对缩进敏感,易写错 ★★★
YAML application.yaml 同.yml 同.yml 文件名较长,不如.yml 常用 ★★☆

写法示例:改 Tomcat 端口为 80

  1. Properties 写法:

    # application.properties
    server.port=80
    
  2. YML 写法(注意冒号后有空格):

    # application.yml
    server:
      port: 80  # 冒号后必须加空格,缩进用空格(不能用Tab)
    

2. 核心规则:优先级与覆盖逻辑

多个配置文件同时存在时,SpringBoot 会按 “优先级高的覆盖低的,不同配置全保留” 的规则生效:
优先级顺序(从低到高)

application.yaml < application.yml < application.properties < Java系统属性(-Dxxx=xxx) < 命令行参数(--xxx=xxx)

通俗举例:

  • 「application.yml」设server.port=81,「application.properties」设server.port=80 → 最终端口是 80(properties 优先级高);
  • 「application.yml」设server.port=81,「application.properties」设spring.datasource.url=xxx → 两个配置都生效(端口 81,数据库地址 xxx);
  • 命令行启动时加java -jar app.jar --server.port=88 → 端口最终是 88(命令行优先级最高)。

二、重点:YML 配置文件(小白必学,主流用法)

YML(.yml)是现在最常用的配置格式,核心优势是 “层级清晰、数据直观”。但它对语法要求严格,小白常踩坑,下面逐个讲透。

1. YML 核心语法规则(记 3 条,少踩坑)

  • 缩进用空格,不能用 Tab:同层级必须左对齐(比如server下的port,缩进 2 个或 4 个空格都可,但要统一);
  • 冒号后必须加空格key: value(冒号和 value 之间有空格,否则报错);
  • 大小写敏感server.portServer.Port是两个不同的配置;
  • # 表示注释:注释内容从 #开始到行尾,不影响配置生效。

2. 数据类型写法(附示例,直接抄)

YML 支持字面值数组对象等常见数据类型,每种类型的写法都有讲究:

(1)字面值(单个值:字符串、数字、布尔等)

数据类型 写法示例 注意事项
字符串 name: 张三"张三\t李四" 含特殊字符(如 \t 换行)需用双引号包裹
整数 age: 18num: 0b1010(二进制) 以 0 开头的数字可能被当进制(如 0127→八进制 87),需加引号**“0127”**
浮点数 price: 3.14pi: 3.14e5 支持科学计数法
布尔值 enable: trueflag: FALSE true/false 不区分大小写
空值 desc: ~ 用~表示 null
日期 birthday: 2024-05-20 日期必须是yyyy-MM-dd格式
时间 createTime: 2024-05-20T14:30:00+08:00 时间和日期用 T 连接,+ 代表时区(东八区)

(2)数组(多个同类型数据)

两种写法:“多行展开”(清晰)和 “单行缩略”(简洁),按需选。

# 1. 多行展开(推荐,可读性强)
subject:
  - Java       # 减号+空格+数据,每行一个元素
  - 前端
  - 大数据

# 2. 单行缩略(适合短数组)
subject: [Java, 前端, 大数据]

(3)对象(多个键值对,如用户、数据库信息)

同样支持多行和单行,实际开发中多行更常用(比如配置数据库):

# 1. 多行展开(配置MySQL示例)
datasource:
  driver-class-name: com.mysql.cj.jdbc.Driver  # 数据库驱动
  url: jdbc:mysql://localhost:3306/ssm_db     # 连接地址
  username: root                               # 账号
  password: 123456                             # 密码

# 2. 单行缩略(简洁版)
datasource: {driver-class-name: com.mysql.cj.jdbc.Driver, url: jdbc:mysql://localhost:3306/ssm_db}
(4)对象数组(多个对象组成的数组,如用户列表)
# 多行展开(推荐)
users:
  - name: 张三
    age: 20
  - name: 李四
    age: 22

# 单行缩略
users: [{name: 张三, age: 20}, {name: 李四, age: 22}]

三、进阶:YML 配置数据怎么读?3 种方法任选

写好配置后,怎么在 Java 代码里获取这些值? 比如读server.portdatasource.url,3 种方法覆盖所有场景。

读取方式 适用场景 优点 缺点
@Value 读取单个简单配置 简单直接 配置分散,难以管理
Environment 动态读取配置 灵活 类型转换需要手动处理
@ConfigurationProperties 读取一组相关配置 类型安全,集中管理 需要创建配置类

方法 1:@Value 注解(读单个数据,最简单)

适合读取 “零散的单个配置项”(比如端口、课程名),直接在变量上用@Value("${配置项}")注入。

示例:读端口和课程名
YML 配置:

# application.yml
lesson: SpringBoot  # 自定义配置:课程名
server:
  port: 80          # 系统配置:端口

Java 代码:

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

@RestController
public class ConfigController {

    // 读单个配置:${一级键.二级键...}
    @Value("${lesson}")
    private String lessonName;  // 注入lesson的值:SpringBoot

    @Value("${server.port}")
    private int port;           // 注入server.port的值:80

    // 测试接口:访问http://localhost/info
    @GetMapping("/info")
    public String getInfo() {
        return "课程:" + lessonName + ",端口:" + port;
    }
}
  • 优点:简单直接,一行代码搞定;
  • 缺点:需要一个个注入,多个配置项时繁琐。

方法 2:Environment 对象(读多个数据,灵活)

适合读取 “多个配置项”,通过@Autowired注入Environment对象,再用getProperty("配置项")获取值。
示例:读数据库配置

YML 配置:

# application.yml
datasource:
  driver-class-name: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost:3306/ssm_db
  username: root
  password: 123456

Java 代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DbController {

    // 注入Environment对象(Spring内置,管理所有配置)
    @Autowired
    private Environment env;

    @GetMapping("/db")
    public String getDbInfo() {
        // 用getProperty读取配置,参数是"一级键.二级键"
        String driver = env.getProperty("datasource.driver-class-name");
        String url = env.getProperty("datasource.url");
        String user = env.getProperty("datasource.username");
        return "驱动:" + driver + ",地址:" + url + ",用户:" + user;
    }
}
  • 优点:不用写多个 @Value,按需读取;
  • 缺点:每次获取都要写字符串键,容易拼错。

方法 3:自定义对象(读批量数据,实际最常用)

适合读取 “一组相关的配置项”(比如数据库、企业信息),把配置封装成 Java 对象,通过@ConfigurationProperties自动注入。核心步骤:定义 Bean + 加注解绑定配置前缀。

示例:封装数据库配置为对象
YML 配置(同上,数据库配置):

datasource:
  driver-class-name: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost:3306/ssm_db
  username: root
  password: 123456

定义封装类(必须是 Spring Bean):

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

// 1. @Component:把类交给Spring管理(必须加,否则无法注入)
@Component
// 2. @ConfigurationProperties(prefix = "datasource"):绑定配置的前缀
// 表示读取"datasource"下的所有子配置项
@ConfigurationProperties(prefix = "datasource")
public class DataSourceConfig {
    // 3. 属性名要和配置项匹配(支持驼峰命名)
    // driver-class-name → driverClassName(横杠转驼峰)
    private String driverClassName;
    private String url;
    private String username;
    private String password;

    // 必须加getter/setter(Spring通过setter注入值)
    public String getDriverClassName() { return driverClassName; }
    public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; }
    public String getUrl() { return url; }
    public void setUrl(String url) { this.url = url; }
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
}

Controller 中使用:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ObjectController {

    // 直接注入自定义的配置对象
    @Autowired
    private DataSourceConfig dataSourceConfig;

    @GetMapping("/db-object")
    public String getDbObject() {
        return "驱动:" + dataSourceConfig.getDriverClassName() 
               + ",密码:" + dataSourceConfig.getPassword();
    }
}

优点:
- 配置项与对象属性自动匹配,不用手动写${}
- 支持 IDE 提示(输入属性名时会提示配置项);
- 适合批量读取相关配置(如数据库、Redis)。
缺点:需要定义专门的封装类,略占代码量。

通过合理使用SpringBoot的配置系统,你可以创建出更加灵活、可维护的应用程序。记住选择适合你项目规模的配置方式,小型项目可以用@Value,中大型项目推荐使用@ConfigurationProperties

四、实用技巧:配置项的 “变量引用”

YML 支持用${配置项}引用已定义的值,避免重复书写,比如拼接路径:

示例 1:路径拼接(复用基础路径)

# 基础路径
baseDir: /usr/local/app

# 引用baseDir,拼接子路径
center:
  dataDir: ${baseDir}/data    # 结果:/usr/local/app/data
  logDir: ${baseDir}/log      # 结果:/usr/local/app/log
  tmpDir: ${baseDir}/tmp      # 结果:/usr/local/app/tmp

示例 2:特殊字符转义(用双引号)
如果配置项含转义字符(如\t制表符、\n换行符),需要用双引号包裹,否则转义字符会失效:

# 不加双引号:\t被当普通字符,结果是"Spring\tBoot"
lesson1: Spring\tBoot

# 加双引号:\t被解析为制表符,结果是"Spring    Boot"
lesson2: "Spring\tBoot"

五、小白必看:2 个高频问题解决

1. YML 写配置没有代码提示?

  • 原因:IDEA 没识别到配置文件,没加载 SpringBoot 的配置元数据。
  • 解决步骤:
    1. 打开 IDEA→File→Project Structure→Facets
    2. 选中你的项目→Customize Spring Boot→Select Configuration Files
    3. 勾选application.yml→OK,重启 IDEA 即可有提示。

2. @ConfigurationProperties 注入失败?
排查 4 点:

  • 类上有没有加@Component(必须是 Spring Bean);
  • prefix的值是否和配置项的前缀一致(比如配置是datasource,prefix 不能写dataSource);
  • 类的属性名是否和配置项匹配(横杠转驼峰,比如driver-class-namedriverClassName);
  • 有没有加getter/setter(Spring 通过 setter 注入值,缺一不可)。

六、总结:核心要点速查表

内容 核心结论 记法
配置文件类型 yml 为主流,properties 优先级最高 写 yml,冲突看 properties
YML 语法核心 缩进用空格,冒号后加空格,大小写敏感 空格缩进,冒号空格不能少
数据读取方法 单个用 @Value,批量用自定义对象 少用 @Value,多用对象封装
变量引用 ${} 复用配置,特殊字符用双引号 路径拼接用 ${},转义加引号

SpringBoot 配置的核心是 “简洁直观”—— 不用写复杂的 XML,按规则填配置项,再用合适的方法读取即可。跟着示例写一遍,你会发现配置其实比想象中简单!

更多推荐