Spring Boot 配置与多环境

笔记/Java/Spring 全家桶/Spring Boot/Spring Boot 配置与多环境

本专题导航#

主题
上一篇入门与启动
本篇配置与多环境
下一篇自动配置与 Starter
Web、运维与测试

背景与动机#

Spring Boot 把大量行为交给外部化配置。面试常问:application.yml 放哪、谁覆盖谁、dev/prod 怎么切换、@Value@ConfigurationProperties 怎么选。本篇专门讲配置体系。

核心原理拆解#

1. 配置文件格式#

支持 propertiesyml/yaml。YAML 层次清晰,适合多环境配置。

server:
port: 8888
app:
name: my-service

等价 properties:

server.port=8888
app.name=my-service

2. 配置加载途径与优先级(高 → 低)#

  1. 命令行参数
  2. java:comp/env JNDI
  3. JVM 系统属性(-D
  4. 操作系统环境变量
  5. random.* 随机属性
  6. jar application.properties/yml
  7. jar application.properties/yml
  8. @PropertySource
  9. 默认属性

同一属性:高优先级覆盖低优先级

3. 配置文件放置位置(高 → 低)#

  1. ./config/
  2. 当前运行目录
  3. classpath 的 config/
  4. classpath 根目录

自定义路径:

Terminal window
java -jar app.jar --spring.config.location=/path/application.yml

4. bootstrap.ymlapplication.yml#

bootstrap 优先于 application,常用于 Spring Cloud 连接配置中心时的引导配置(如 Nacos、Config Server 地址)。

5. 修改端口示例#

server:
port: 8888
Terminal window
java -jar app.jar --server.port=8888
java -Dserver.port=8888 -jar app.jar

6. Spring Profiles 多环境#

文件用途
application.yml主配置
application-dev.yml开发
application-test.yml测试
application-prod.yml生产

激活方式:

spring:
profiles:
active: dev
Terminal window
java -jar app.jar --spring.profiles.active=prod

7. 读取配置的注解#

方式说明
@Value("${key}")注入单个属性,支持默认值 ${key:default}
@ConfigurationProperties(prefix = "app")批量绑定前缀,适合多字段配置类
@PropertySource加载额外 properties 文件
Environment编程式读取
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private int timeout;
// getter/setter
}

需在配置类上 @EnableConfigurationProperties(AppProperties.class) 或给该类加 @Component

常见陷阱与错误示例#

1. 多环境配置未激活 profile#

打 prod 包却带着 dev 数据源,上线即事故。CI/CD 中显式指定 spring.profiles.active=prod

2. @Value 注入失败仍启动#

拼写错误的 key 可能启动时报错;生产环境建议配合 @ConfigurationProperties + 校验或启动时检查必填项。

3. 把敏感信息写进仓库里的 yml#

密码、密钥应走环境变量或配置中心,不要提交到 Git。

面试高频问题#

完整 30 道速查见 Spring Boot 面试题 30 道

一句话总结#

配置记住三件事:优先级链、文件位置、Profiles;读配置优先 @ConfigurationProperties 管理一组属性,@Value 适合零散单项。

文章目录

文章目录