🌍 外部化配置
配置优先级(从高到低):
- 命令行参数
- SPRING_APPLICATION_JSON中的属性
- ServletConfig初始化参数
- ServletContext初始化参数
- JNDI属性
- Java系统属性
- 操作系统环境变量
- jar包外的application-{profile}.properties
- jar包内的application-{profile}.properties
- jar包外的application.properties
- jar包内的application.properties
💡 实用技巧
生产环境建议使用环境变量或外部配置文件,避免敏感信息打包到jar中
🔐 配置加密
敏感信息处理:
- 使用环境变量存储密码
- 使用Spring Cloud Config加密
- 使用Jasypt加密配置
- 使用外部密钥管理系统
环境变量示例:
spring:
datasource:
url: ${DATABASE_URL:jdbc:h2:mem:testdb}
username: ${DATABASE_USERNAME:sa}
password: ${DATABASE_PASSWORD:}
app:
jwt:
secret: ${JWT_SECRET:default-secret}
expiration: ${JWT_EXPIRATION:86400}
命令行启动示例:
export DATABASE_URL=jdbc:mysql://prod-db:3306/proddb
export DATABASE_USERNAME=prod_user
export DATABASE_PASSWORD=secure_password
java -jar app.jar --spring.profiles.active=prod
✅ 配置验证
使用@ConfigurationProperties验证:
@ConfigurationProperties(prefix = "app")
@Component
@Validated
public class AppProperties {
@NotBlank(message = "应用名称不能为空")
private String name;
@Min(value = 1, message = "端口号必须大于0")
@Max(value = 65535, message = "端口号不能超过65535")
private int port = 8080;
@Valid
private Database database = new Database();
public static class Database {
@NotBlank(message = "数据库URL不能为空")
private String url;
@NotBlank(message = "用户名不能为空")
private String username;
// getter和setter
}
// getter和setter
}
⚠️ 注意事项
- 启用配置验证需要添加spring-boot-starter-validation依赖
- 验证失败会导致应用启动失败
- 建议为所有配置属性添加默认值
🎯 最佳实践
配置管理建议:
- 使用YAML格式提高可读性
- 合理使用Profile分离环境
- 敏感信息使用环境变量
- 为配置属性添加验证
- 使用@ConfigurationProperties替代@Value
性能优化:
- 避免在配置中使用复杂表达式
- 合理设置连接池参数
- 启用适当的缓存配置
- 配置合理的超时时间
🏆 核心要点
配置文件是SpringBoot应用的重要组成部分,合理的配置管理能够提高应用的可维护性和部署灵活性