Spring Boot - 统一配置管理
Spring Boot 核心 —— 统一配置管理
1. 核心理论:为什么需要统一配置管理?
在传统的 Spring 应用中,配置信息(如数据库连接、服务器端口、自定义参数等)通常散落在多个 XML 文件或 Java 配置类中,管理起来非常不便。Spring Boot 提倡使用一个统一的全局配置文件来管理所有环境的配置。
-
配置文件格式: Spring Boot 支持两种主要的配置文件格式:
application.properties: 经典的键值对格式。application.yml(或.yaml): YAML 格式,具有层级结构,更简洁、更直观。(推荐使用)
-
存放位置: 这两种文件通常放在
src/main/resources目录下。 -
核心思想: 将配置与代码分离。使得应用程序无需重新编译和打包,就能通过修改配置文件来适应不同的运行环境(如开发、测试、生产)。
-
生活比喻: 想象你在玩一个复杂的电子游戏。
- 没有统一配置: 每次你想调整游戏音量、画面质量、按键设置时,都需要在游戏的不同菜单里来回寻找,非常麻烦。
- 有统一配置 (
application.yml): 游戏提供了一个统一的“设置中心”。所有可调整的选项(音量、画质、按键)都以一个清晰的树状结构列在这里,你可以一目了然地进行修改。这个“设置中心”就是application.yml。
2. 深度剖析:YAML 语法与配置读取
2.1 YAML (.yml) 语法简介
YAML (YAML Ain't Markup Language) 是一种对人类非常友好的数据序列化语言。它的基本语法规则是:
- 大小写敏感。
- 使用缩进表示层级关系。
- 缩进时不允许使用 Tab 键,只能使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
key: value形式表示键值对,冒号后面必须跟一个空格。
# 这是一个典型的 application.yml 文件
server:
port: 8081 # 设置服务器端口
servlet:
context-path: /myapp # 设置应用上下文路径
# 自定义配置
myapp:
author: "zhaowumian"
contact:
phone: 123456789
email: zhaowumian@example.com
servers:
- 192.168.1.100
- 192.168.1.101
2.2 如何在代码中读取配置?
Spring Boot 提供了多种方式将配置文件中的值注入到代码中。
方法一:使用 @Value 注解
- 作用: 用于将配置文件中的单个值注入到类的字段上。
- 语法: 使用
${...}占位符。
@Component
public class MyComponent {
@Value("${myapp.author}")
private String author;
@Value("${server.port}")
private int port;
public void printConfig() {
System.out.println("Author is: " + author);
System.out.println("Server port is: " + port);
}
}
方法二:使用 @ConfigurationProperties 注解 (推荐)
-
作用: 用于将配置文件中一组相关的配置,以类型安全的方式,批量注入到一个 Java Bean 中。
-
优点:
- 类型安全: 自动进行类型转换(如字符串转数字、日期等)。
- 批量注入: 代码更简洁,无需为每个属性都写一个
@Value。 - 强大的数据绑定: 支持复杂的对象图(如
Map,List)。 - JSR-303 数据校验: 可以配合
@Validated注解进行数据格式校验。
-
使用步骤:
- 创建一个与配置层级对应的 Java Bean。
- 在 Bean 上使用
@ConfigurationProperties(prefix = "...")注解,指定要绑定的配置前缀。 - 在主启动类或配置类上使用
@EnableConfigurationProperties启用这个配置 Bean。
// 1. 创建配置类
@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppConfig {
private String author;
private Contact contact;
private List<String> servers;
// 必须有 Getters 和 Setters
// ...
public static class Contact {
private String phone;
private String email;
// ... Getters and Setters ...
}
}
// 2. 在需要的地方注入并使用
@RestController
public class ConfigController {
@Autowired
private MyAppConfig myAppConfig;
@GetMapping("/config")
public MyAppConfig getConfig() {
return myAppConfig;
}
}
Q&A: @Value vs. @ConfigurationProperties
@Value: 适用于注入单个、简单的配置值。@ConfigurationProperties: 适用于将一组相关的配置项映射为一个类型安全的 Java 对象。当配置项较多,或者具有层级结构时,应优先使用@ConfigurationProperties,因为它更易于管理和验证。
3. 多环境配置 (Profile)
在实际开发中,我们通常有开发 (dev)、测试 (test)、生产 (prod) 等多套环境,它们的配置(如数据库地址)是不同的。Spring Boot 提供了非常方便的多环境配置支持。
-
命名约定: 创建多个以
application-{profile}.yml格式命名的配置文件。例如:application-dev.yml(开发环境配置)application-prod.yml(生产环境配置)
-
激活 Profile: 在主配置文件
application.yml中,通过spring.profiles.active属性来指定当前要激活哪个环境。
# application.yml (主配置文件)
spring:
profiles:
active: dev # 激活开发环境配置
# application-dev.yml
server:
port: 8080
mysql:
host: localhost
# application-prod.yml
server:
port: 80
mysql:
host: 10.0.0.1
- 工作原理: 当 Spring Boot 启动时,它会首先加载主配置文件
application.yml,然后根据spring.profiles.active的值,再去加载对应的环境配置文件(如application-dev.yml)。如果两个文件中有相同的配置项,环境配置文件中的值会覆盖主配置文件中的值。
Q&A: properties vs. yml
- 如果
src/main/resources目录下同时存在application.properties和application.yml,application.properties的优先级更高,它会覆盖application.yml中的相同配置。

浙公网安备 33010602011771号