Java多环境配置核心是同一套代码读取不同配置值,关键在配置分离与激活机制;通过spring.profiles.active指定激活profile以加载对应application-{profile}.yml,支持多profile叠加,需严格遵循命名与路径规范,敏感配置应外置并用占位符注入,Bean级条件装配用@Profile注解,注意大小写一致性。

Java 多环境配置的核心不是“写多套代码”,而是让同一套代码在不同环境里读取不同的配置值——关键在于配置的分离与激活机制。
用 spring.profiles.active 控制环境加载
Spring Boot 项目中,最直接的环境切换方式是通过该属性指定当前激活的 profile。它决定哪些 application-{profile}.yml(或 .properties)文件会被加载。
- 开发时加
spring.profiles.active=dev,就会加载application-dev.yml - 生产部署时设为
prod,就加载application-prod.yml - 可同时激活多个:如
spring.profiles.active=prod,mysql,会叠加加载application-prod.yml和application-mysql.yml - 该值可通过命令行参数、JVM 参数、环境变量、
application.yml内部设置等多种方式传入,优先级依次递减
配置文件命名与层级必须严格匹配
Spring Boot 对配置文件名和位置有硬性约定,错一个字符或放错目录就会静默失效。
- 主配置文件必须叫
application.yml或application.properties,且放在src/main/resources/下 - 环境专用文件必须是
application-{profile}.yml形式,比如application-dev.yml,不能写成dev.yml或application_dev.yml - 若使用 Maven 多模块,确保资源文件被正确打包进最终 jar;检查
pom.xml中<resources></resources>配置是否遗漏了**/*.yml - IDE 运行时,IntelliJ 默认不会把
src/main/resources下未被标记为 “Resources Root” 的子目录纳入 classpath —— 手动右键目录 → “Mark as → Resources Root”
敏感配置(如数据库密码)别硬编码在 yml 里
开发环境可以写明文,但生产环境必须避免把密码塞进版本库。推荐组合使用外部化配置 + 环境变量。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
- 在
application-prod.yml中用占位符:spring.datasource.password=${DB_PASSWORD:changeme} - 启动时通过环境变量注入:
DB_PASSWORD=real123 java -jar app.jar - Kubernetes 中用
envFrom: secretRef注入;Docker Compose 用environment:或env_file: - 注意:如果环境变量没设,又没给默认值(冒号后为空),应用启动会直接报
IllegalArgumentException: Could not resolve placeholder
Profile 激活时机影响 Bean 创建逻辑
光靠配置文件切换还不够——有些 Bean 只应在特定环境存在,比如开发用的 H2 数据库连接池,生产必须用 Druid。
- 用
@Profile("dev")注解在@Configuration类或@Bean方法上,实现条件化装配 - 避免在
@Bean方法内部写if (profile.equals("dev"))—— 这样 Bean 总是被创建,只是内容不同,违背了 profile 的设计本意 - 测试类中可通过
@ActiveProfiles("test")指定测试运行时的 profile - 若用了
@ConditionalOnProperty,注意它和@Profile是两套机制:前者看配置项是否存在/值是否匹配,后者看 profile 是否激活
最容易被忽略的是 profile 名称的大小写和拼写一致性——dev 和 DEV 在 Spring Boot 中是两个完全不同的 profile,且默认不自动转换。CI/CD 脚本里写错一个字母,服务就可能连上开发库跑在生产机器上。

















