为什么需要配置文件
咱们主要就是解决硬编码的问题,所谓的硬编码,就是将代码给写死了,不灵活。
SpringBoot的配置文件
咱们Spring Boot的中配置文件主要写以下东西:
- 项⽬的启动端
- 数据库的连接信息(包含⽤⼾名和密码的设置)
- 第三⽅系统的调⽤密钥等信息
- ⽤于发现和定位问题的普通⽇志和异常⽇志等
SpringBoot配置文件的使用
java
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
此时我在浏览器输入的URL是:http://localhost:8080/user/hello,得到的结果是:

那么接下来我们在配置文件中加入以下的配置信息:

重启服务器之后,我们刚才的访问路径就不再成功:

原因就是我们将端口号变为了9090,所以此时正确的URL路径应该是:http://localhost:9090/user/hello

配置文件的介绍
配置文件有三种格式
- application.properties
- application.yml
- application.yaml
其中yml是yaml的缩写,所以其实核心就只有两个,我们springboot默认的格式是application.properties。
如果properties和yml同时存在怎么办?
如果properties和yml同时存在,那么他们两个同时生效(取并集),而如果在两个配置文件中有冲突的项目,那么以properties为准,它的优先级高于yml。
比如:

在上述两个配置文件中,我们都配置了我们项目的端口号,那么此时我们去启动项目,看他以哪一个端口号为准。

从我们的日志中可以看出,启动项目它的端口是9090那么也就得出了我们这两个配置文件有相同的项目的时候,以properties为主,也就是properties子的优先级大于yml的优先级。
properties配置文件的介绍
properties配置文件的语法
properties配置文件中的内容是以键值对形式存在的。
key和value之间使用等号(=)来分割。
key的建议就是所有的单词用小写,单词之间用点(.)来分割。
例如:
properties
# 配置项⽬端⼝号
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
读取配置文件中的值
首先呢,你需要了解一点,就是说我们的配置文件中所涉及到的配置信息有两个分类,它一类是由spring boot自己去定义的配置信息,那这些配置信息呢由我们springboot自动的读取;【自定义配置信息】而另为一类的配置信息是由我们开发人员自己去设置的配置信息,那么这些配置信息我们就得来学习他如何通过我们程序去读取出来。
自定义配置信息都读取
properties
server.port=9090
# 自定义配置信息
my.key=1
如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤@Value 注解来实现。
@Value 注解使⽤" ${} "的格式读取,【我们读取值,一般使用的符号都是$】如下代码所⽰:
java
@RequestMapping("/prop")
@ResponseBody
@Controller
public class PropertiesController {
@Value(value = "${my.key}")
private String myKey;//我的密钥
@RequestMapping("/v1")
public String readValue(){
return "读取到配置文件的值是:" + this.myKey;
}
}
此时的结果:

详细解释


properties的缺点
1. 类型不安全
所有值都是字符串,需手动转换,易出错。
properties
# application.properties
server.port=8080
app.rate=0.95
java
@Value("${server.port}")
private String portStr; // 得到字符串"8080",需转int
@Value("${app.rate}")
private String rateStr; // 得到"0.95",需转double
2. 结构扁平,无法表达层级
用点号模拟层级,但本质扁平,长前缀冗余。
properties
db.mysql.driver=com.mysql.jdbc.Driver
db.mysql.url=jdbc:mysql://localhost/test
db.mysql.username=root
db.mysql.password=123456
3. 数组/列表配置繁琐
需用下标索引,可读性差。
properties
my.servers[0]=192.168.1.1
my.servers[1]=192.168.1.2
my.servers[2]=192.168.1.3
4. 修改后需重启应用
静态文件,运行时修改不生效。
bash
# 修改port后必须重启应用才能生效
5. 编码问题
默认ISO-8859-1,中文需转义,可读性差。
properties
# 中文会被转义
app.name=\u4e2d\u6587\u540d\u79f0
6. 缺乏校验与文档
纯文本,无类型校验,易写错键名。
properties
# 写错键名,编译不报错,运行时才暴露
datasrouce.url=jdbc:mysql://localhost/test # 应为 datasource
总结:properties简单但功能弱,不适合复杂配置。现代开发更推荐YML(层级清晰、支持列表)或配置中心(动态刷新、统一管理)。
yml配置文件的介绍
yml的语法
1.如果只有一层 键:(冒号) [空格]值
yml是树形结构的配置⽂件,它的基础语法是"key: value".
key和value之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略。
yml
key: value
2.如果有多层

yml配置不同数据类型及null
yml
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~代表null
null.value: ~
# "" 空字符串
empty.value: ''
yml配置信息的读取
和我们的properties是一样,我们配置文件中有些信息是Spring Boot的自动去读的,我们自己写的自定义信息是由我们自己写代码去读的。
yml
# 自定义信息
my:
key1: 10
key2: true
那么它读取的语法呢,是和我们properties是读取的语法是一样的,也是使用@value注解,例如:
java
package com.zhongge.ioc.controller;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
/**
* @ClassName YmlController
* @Description TODO 读取YML配置文件的信息
* @Author 笨忠
* @Date 2026-03-05 20:54
* @Version 1.0
*/
@Controller
public class YmlController {
@Value(value = "${my.key1}")
private Integer value1;
@Value("${my.key2}")
private Boolean value2;
@PostConstruct//这个注解作用是在初始化的时候会执行该方法
public void init() {
System.out.println("读取到的数值1:" + value1);
System.out.println("读取到的数值2:" + value2);
}
}

yml配置对象
配置:
yml
# 配置对象
person:
id: 1
name: 李白
age: 18
使用:
1.我们写一个person类,首先我们什么都不处理。
java
@Data
@Configuration//将该对象交给spring容器管理
public class Person {
private Integer id;//编号
private String name;//姓名
private Integer age;//年龄
}
2.加上@Configuration这个注解,我们将这个person类交给spring IOC容器来管理

3.然后现在我们去容器中取出这个对象,打印出来看它的一个结果。
java
@Autowired
private Person person;
@PostConstruct//这个注解作用是在初始化的时候会执行该方法
public void init() {
System.out.println(person);
}

4.可以看出我们得出的值是空的没有值,那么我们想要到配置文件中的值读到这个对象上去。
方法:使用@ConfigurationProperties注解,译为配置属性
代码:
java
@Data
@Configuration//将该对象交给spring容器管理
@ConfigurationProperties(prefix = "person")//读取配置文件中的对象中的属性
public class Person {
private Integer id;//编号
private String name;//姓名
private Integer age;//年龄
}

最后我们的结果就如下:

yml配置集合和数组
yml配置集合和数组的形式是一样的,所以我们以配置list集合为例
配置文件
yml
# 配置集合
dbtypes: #对象
name: #属性
- mysql #元素1
- db2 #元素2
- sqlserver #元素3
注意事项如图:

我们配置集合和map都是基于对象的,也就是说如图:

读取
读取的方式,我们也是使用@ConfigurationProperties这个注解。
java
@Data//目的是帮我们生成get和set方法
@Configuration//目的是让spring自动为我们去创建和管理这个对象【方便我们去获取这个对象】
@ConfigurationProperties(prefix = "dbtypes")
public class DbTypes {
private List<String> name;
}
java
@Autowired//从spring容器中取出这个值
private DbTypes dbTypes;
@PostConstruct//这个注解作用是在初始化的时候会执行该方法
public void init() {
System.out.println(dbTypes);
}

yml配置map集合
配置:注意我们配置都是基于对象【上述有提到过】
yml
# 配置map集合
result:
type:
success: v1
fail: v2

读取
读取的方式,我们也是使用@ConfigurationProperties这个注解。
java
@Data//会为我们自动加上set和get
@Configuration//spring自动为我们创建和管理这个对象
@ConfigurationProperties(prefix = "result")//读取配置文件中的值
public class Result {
private Map<String, String> type;
}
java
@Autowired
private Result result;
@PostConstruct//这个注解作用是在初始化的时候会执行该方法
public void init() {
System.out.println(result);
}
结果:

YML 配置文件的优缺点
一、优点
1. 层次结构清晰,可读性强
通过缩进天然表达层级,无需点号前缀,一目了然。
yaml
# application.yml
server:
port: 8080
servlet:
context-path: /api
spring:
datasource:
url: jdbc:mysql://localhost/test
username: root
password: 123456
2. 支持复杂数据类型(列表、映射)
简洁表达数组、集合等。
yaml
my:
servers:
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
roles:
admin: ["read", "write", "delete"]
guest: ["read"]
3. 多文档块支持(多环境配置)
用 --- 分隔不同环境,一个文件搞定多环境。
yaml
# 默认配置
spring:
profiles:
active: dev
---
# 开发环境
spring:
profiles: dev
datasource:
url: jdbc:mysql://localhost/dev
---
# 生产环境
spring:
profiles: prod
datasource:
url: jdbc:mysql://prod-server/prod
4. Spring Boot 原生支持,自动绑定到 Java 对象
可直接与 @ConfigurationProperties 配合,类型安全。
yaml
app:
name: MyApp
version: 1.0.0
features:
- feature1
- feature2
java
@ConfigurationProperties(prefix = "app")
@Component
public class AppConfig {
private String name;
private String version;
private List<String> features;
// getters/setters
}
二、缺点
1. 对缩进严格敏感
空格数量必须一致,混用制表符(Tab)会导致解析失败。
yaml
server:
port: 8080 # 用了4个空格,没问题
context-path: /api # 缩进不一致,报错!
2. 不支持制表符(Tab)
只能使用空格,编辑器中容易引入Tab引发诡异错误。
3. 解析性能略低于 properties
YAML 需要解析缩进和复杂结构,比简单键值对的 properties 稍慢,但在大多数应用中可忽略。
4. 复杂嵌套时阅读困难
过深的缩进和嵌套可能让文件变得难以阅读。
yaml
# 三层嵌套已经有些晕
a:
b:
c:
d:
e: value