Spring Boot外部配置
外观
Spring Boot外部配置是Spring框架中用于管理应用程序配置的核心机制之一,它允许开发者在不修改代码的情况下,通过外部资源(如配置文件、环境变量、命令行参数等)动态调整应用行为。本条目将详细介绍其工作原理、优先级规则及实际应用场景。
概述[编辑 | 编辑源代码]
Spring Boot通过统一的Environment抽象层加载外部配置,支持多种配置源并按优先级合并。核心设计目标是实现约定优于配置,同时保留灵活性。外部配置的主要用途包括:
- 环境适配(开发/测试/生产环境切换)
- 敏感信息隔离(如数据库密码)
- 运行时参数调整
配置源与优先级[编辑 | 编辑源代码]
Spring Boot按以下顺序加载配置(后出现的配置覆盖前者):
数学表示为:
配置格式[编辑 | 编辑源代码]
1. 属性文件(.properties)[编辑 | 编辑源代码]
传统键值对格式:
# application.properties
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
2. YAML配置[编辑 | 编辑源代码]
支持层次化结构:
# application.yml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: admin
代码示例[编辑 | 编辑源代码]
基础注入[编辑 | 编辑源代码]
@RestController
public class ConfigDemoController {
@Value("${custom.message:Default Value}")
private String message;
@GetMapping("/message")
public String showMessage() {
return message;
}
}
测试用例:
配置值 | 响应输出 |
---|---|
未设置 | Default Value
|
custom.message=Hello |
Hello
|
类型安全配置[编辑 | 编辑源代码]
@Configuration
@ConfigurationProperties(prefix = "mail")
public class MailConfig {
private String host;
private int port;
// getters & setters
}
对应配置:
mail:
host: smtp.example.com
port: 587
高级特性[编辑 | 编辑源代码]
Profile特定配置[编辑 | 编辑源代码]
文件命名规则:
application-{profile}.properties
application-{profile}.yml
激活方式:
java -jar app.jar --spring.profiles.active=prod
加密配置[编辑 | 编辑源代码]
使用Jasypt集成:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
加密值格式:
ENC(加密字符串)
实际案例[编辑 | 编辑源代码]
多环境数据库配置[编辑 | 编辑源代码]
application-dev.yml
:
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
application-prod.yml
:
spring:
datasource:
url: jdbc:mysql://prod-db:3306/appdb
username: ${DB_USER}
password: ${DB_PASS}
云原生配置[编辑 | 编辑源代码]
Kubernetes部署时结合ConfigMap:
# k8s-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
application.yaml: |
logging:
level:
root: INFO
cache:
timeout: 300s
最佳实践[编辑 | 编辑源代码]
- 将敏感信息存储在环境变量或Vault中
- 使用
@ConfigurationProperties
替代@Value
实现类型安全 - 为不同环境维护独立的Profile文件
- 在
application.properties
中设置通用默认值
常见问题[编辑 | 编辑源代码]
配置未生效[编辑 | 编辑源代码]
检查顺序:
- 确认配置源在优先级列表中
- 检查属性拼写(包括大小写)
- 验证Profile是否激活
复杂类型绑定[编辑 | 编辑源代码]
对于嵌套对象,需提供完整的属性路径:
server:
ssl:
enabled: true
key-store: classpath:keystore.jks
对应Java类:
@ConfigurationProperties(prefix = "server.ssl")
public class SslConfig {
private boolean enabled;
private Resource keyStore;
// getters & setters
}