Java 配置管理
配置与代码分离:来源优先级、类型安全与可测试注入。
#type / concept
#status / growing
#tech / dev
#resource / java
[!info] 关联笔记
Java 配置管理
这个概念为什么出现
同一构件要跑在 dev/stage/prod:端口、数据库 URL、特性开关不同。配置必须外置,且可测试、可审计。
[!abstract] 一句话理解 配置从环境/文件/启动参数注入,与代码分离;明确优先级与类型转换,密钥不进仓库。
最小可运行示例
场景:从环境变量读服务端口,缺省 8080
public class PortConfig {
static int port() {
String raw = System.getenv().getOrDefault("APP_PORT", "8080");
int p = Integer.parseInt(raw);
if (p < 1 || p > 65535) throw new IllegalArgumentException("bad port");
return p;
}
public static void main(String[] args) {
System.out.println(port());
}
}
javac PortConfig.java && APP_PORT=9090 java PortConfig
期望:
9090
结合场景再看三个关注点
- 缺省值要安全。
- 校验失败要快死在启动期。
- 密钥用密钥管理,不是明文 properties 提交。
核心概念与准确模型
1. 来源
env / 系统属性 / 配置文件 / 远程配置中心
2. 优先级
团队写清覆盖顺序,避免“神秘生效”。
3. 类型安全
解析 int/bool/时长;框架(Spring)可绑定对象。
边界情况与反直觉行为
- 容器与本地 env 注入差异。
- 多文档 yaml 合并坑。
- 动态刷新与一致性。
常见误区
[!warning] 常见误区:配置散落硬编码常量 改环境要重新编译发布,违反十二要素。
工程实践
- 启动时校验全部必填配置。
- 配置项文档化。
- 测试注入假配置。
- 敏感项脱敏日志。
本节总结
- 外置配置
- 校验与优先级
- 密钥分离
自测题
- 为什么配置错误应启动失败?
- 系统属性与环境变量如何选?
参考答案
- 避免带错误配置半运行造成数据事故。
- 容器/12-factor 常偏 env;JVM 级调优常用系统属性;关键是一致与文档。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| 12-Factor Config | 工程原则 | 配置外置 |