目录
1. 配置文件概述
1.1 什么是配置文件?
配置文件是用于存储应用程序配置信息的文件,它将可能会改变的参数从程序代码中分离出来,实现配置与代码的分离。这解决了硬编码(将数据直接写入源代码)带来的问题,使应用程序无需重新编译即可适应不同的运行环境。
硬编码 vs 配置化 对比图:
1.2 Spring Boot 配置文件的作用
Spring Boot 配置文件是其约定优于配置理念的核心体现,它规范化了框架和集成的第三方库的配置方式。主要作用包括:
-
服务器配置:如修改内嵌 Tomcat 端口号 (
server.port)。 -
数据源配置:如配置数据库连接 URL、用户名、密码 (
spring.datasource.url)。 -
外部密钥管理:如配置调用第三方 API 的密钥。
-
日志管理:配置日志输出级别和格式。
2. 配置文件的格式与优先级
2.1 支持的格式
Spring Boot 默认支持并自动加载 classpath下(通常是 src/main/resources目录)的三种配置文件:
-
application.properties (主流,键值对格式) -
application.yml (主流,树形结构格式,YAML 的简写) -
application.yaml (与.yml功能完全相同)
项目资源目录结构图:
src/main/resources/
├── static/ # 静态资源(js, css, images)
├── templates/ # 模板文件(Thymeleaf, Freemarker)
├── application.properties
└── application.yml # 最常用的两种配置文件
2.2 多文件优先级与冲突规则
当一个项目中存在多个配置文件时,Spring Boot 有一套清晰的加载和优先级规则。
配置文件加载优先级与共存关系示意图:
结论:虽然支持共存,但强烈建议在项目中只使用一种配置文件格式(目前 .yml更为流行),以降低维护复杂度。
3. Properties 配置文件详解
3.1 基本语法
.properties文件采用简单的键值对格式。
-
语法:
key = value或key: value -
注释:使用
#开头
# 配置服务器端口
server.port=9090
# 配置数据库连接
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
# 自定义配置
myapp.name=My SpringBoot Application
3.2 读取配置
在 Spring 管理的 Bean(如 @Controller, @Service, @Component)中,使用 @Value注解读取。
@RestController
public class MyController {
// 使用 @Value 注解注入配置值
@Value("${myapp.name}")
private String appName;
@Value("${server.port}")
private Integer port;
@GetMapping("/info")
public String getInfo() {
return "Application: " + appName + " is running on port: " + port;
}
}
访问 http://localhost:9090/info将返回:Application: My SpringBoot Application is running on port: 9090。
3.3 缺点分析
.properties格式在配置具有层次结构的数据时,会出现大量重复的前缀,导致文件冗长。
spring.datasource.url = ...
spring.datasource.username = ...
spring.datasource.password = ...
spring.datasource.driver-class-name = ...
# 大量重复的 'spring.datasource.'
4. YAML 配置文件详解
YAML (YAML Ain't Markup Language) 是一种人性化的数据序列化标准,层次清晰,大大减少了配置中的冗余信息。
4.1 基本语法
-
语法:
key: value(注意:冒号后面必须有一个空格) -
层次:使用缩进表示层级关系(不能用 Tab 键,只能用空格)。
等价的 YAML 配置:
# 服务器配置
server:
port: 9090
# 数据源配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mydb
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# 自定义配置
myapp:
name: My SpringBoot Application
4.2 配置不同类型的数据
4.2.1 普通值(数字、字符串)
my:
value: 42
string: Hello World
string-with-quotes: 'Hello \n World' # 单引号:转义特殊字符,输出\n
string-with-double-quotes: "Hello \n World" # 双引号:不转义,输出换行
4.2.2 对象 (Map)
# 写法一:块样式
student:
id: 1
name: John Doe
age: 18
# 写法二:行内样式(等同于上式)
student: {id: 1, name: John Doe, age: 18}
读取对象配置:需要使用 @ConfigurationProperties注解,而不是 @Value。
-
定义配置类:
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Data @Component @ConfigurationProperties(prefix = "student") // 前缀绑定 public class StudentProperties { private Integer id; private String name; private Integer age; } -
在Controller中注入使用:
@RestController public class StudentController { @Autowired private StudentProperties student; @GetMapping("/student") public String getStudent() { return student.toString(); // 输出: StudentProperties(id=1, name=John Doe, age=18) } }
4.2.3 数组 / List
# 写法一:块样式
fruits:
- Apple
- Banana
- Orange
# 写法二:行内样式
fruits: [Apple, Banana, Orange]
配置类:
@ConfigurationProperties(prefix = "my")
@Data
@Component
public class MyListConfig {
private List<String> fruits;
}
4.2.4 Map
# 写法一:块样式
maptypes:
map:
k1: v1
k2: v2
k3: v3
# 写法二:行内样式
maptypes: {map: {k1: v1, k2: v2, k3: v3}}
配置类:
@ConfigurationProperties(prefix = "maptypes")
@Data
@Component
public class MyMapConfig {
private Map<String, String> map;
}
4.3 YAML 的优缺点
| 优点 | 缺点 |
|---|---|
| ✅ 可读性高:层次结构清晰,易于理解 | ❌ 格式严格:依赖缩进,空格错误会导致解析失败 |
| ✅ 无冗余:通过层级避免了 key 的重复前缀 | ❌ 不适合复杂配置:过于复杂的嵌套配置可读性会变差 |
| ✅ 支持丰富数据类型:天然支持对象、集合等 |
5. 对比
| 特性 |
|
|
|---|---|---|
| 语法 | 键值对 ( | 树形结构 ( |
| 可读性 | 较低,尤其是复杂配置 | 高,层次清晰 |
| 冗余度 | 高,key 重复严重 | 低,无重复前缀 |
| 数据类型 | 主要支持字符串 | 支持丰富(字符串、对象、数组、集合等) |
| 学习成本 | 低 | 中等(需熟悉缩进规则) |
| 适用场景 | 简单、小型的项目 | 中大型项目,微服务架构 |
注意事项
-
统一格式:在一个项目中选定一种配置文件格式并坚持使用,推荐 YAML (
.yml)。 -
配置分组:对于自定义的复杂配置,使用
@ConfigurationProperties进行分组绑定,而不是散落地使用@Value。 -
多环境配置:使用
application-{profile}.yml(如application-dev.yml,application-prod.yml)来管理不同环境的配置,并通过spring.profiles.active属性激活。
451



被折叠的 条评论
为什么被折叠?



