Spring Boot项目默认用application.properties或application.yml,Java SE项目常用config.properties;加载需通过类加载器而非File,多环境配置应分离敏感信息并用profile激活。

Java项目里该用哪种配置文件格式
没有统一标准,但实际开发中 application.properties 和 application.yml 是 Spring Boot 项目的事实默认;纯 Java SE 项目更常用 config.properties 或 settings.xml(尤其搭配 Maven)。选错格式不会报错,但会导致 @Value 注入失败、ResourceBundle 找不到键,或 ClassLoader.getSystemResource() 返回 null。
-
.properties:最轻量,兼容所有 JDK 版本,适合简单键值对,如db.url=jdbc:h2:mem:test -
.yml:支持嵌套结构,但缩进敏感,YAML 解析器(如 SnakeYAML)需额外引入,Spring Boot 2.4+ 默认启用spring.config.import后行为有变化 -
XML:Maven 的pom.xml、Log4j2 的log4j2.xml属于这类,解析开销略大,但 IDE 支持校验强
如何在运行时正确加载 classpath 下的配置文件
关键不是“放哪”,而是“怎么找”。把 config.properties 放进 src/main/resources 后,不能直接用 new File("config.properties") —— 这会去当前工作目录找,而非 classpath。必须走类加载器路径。
- 推荐方式:
Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties") - 如果返回
null,说明资源未被打包进 JAR 或路径拼写错误(注意大小写、是否带/前缀) - Spring Boot 中优先用
@ConfigurationProperties绑定,不要手动Properties.load(),否则丢失类型转换和验证能力 - 测试时若用
mvn test,确保src/test/resources下有对应测试配置,且未被maven-surefire-plugin排除
多环境配置怎么避免硬编码和误提交
用 profile 切换本身不难,难的是隔离敏感信息。常见错误是把 application-prod.properties 提交到 Git,或在代码里写死数据库密码。
- Spring Boot 推荐拆分:主配置
application.yml写公共项,application-dev.yml/application-prod.yml写差异项,通过spring.profiles.active=prod激活 - 生产密钥、API Token 等绝不能进代码库——改用 JVM 参数:
-Dspring.datasource.password=${DB_PASS},再配合系统环境变量或容器 Secret 注入 - Maven 多环境打包用
profiles+resources filtering,但注意${...}占位符和 Spring 的${...}冲突,需设resource.delimiter=@避免 - IDEA 运行配置里设置
Active profiles是临时的,别依赖它覆盖 CI 流水线逻辑
为什么 @Value("${xxx}") 有时取不到值还静默失败
这不是 bug,是 Spring 的宽松绑定策略导致的:当配置项不存在时,默认返回空字符串或 null,除非显式声明 required = true 或用 @NotNull 校验。
立即学习“Java免费学习笔记(深入)”;
- 写成
@Value("${app.timeout:3000}")会设默认值,但掩盖了配置缺失问题;上线后才发现超时时间没生效 - 如果属性名含下划线(
app_max_retry),而配置文件里是app.max.retry,Spring Boot 2.2+ 默认开启relaxed-binding,能自动匹配;但旧版本或自定义PropertySourcesPlaceholderConfigurer时可能失败 - 最稳妥方式是用
@ConfigurationProperties("app")配合@Validated,字段加@Min(1)等注解,启动时报错而非运行时异常 - 注意
@Value不能用在静态字段上,也不能用在非 Spring 管理的类(如 new 出来的对象)中










