@profile 是 spring 官方推荐的环境隔离核心方式,通过标注配置类或@bean方法实现bean按环境加载,配合application-{profile}.yml实现配置与bean双重隔离,禁用if判断和动态profile检查。

用 @Profile 注解实现环境隔离,核心是让 Spring 容器只注册当前激活环境所需的 Bean,而不是靠 if 判断去选逻辑分支。它不是“辅助手段”,而是 Spring 官方推荐的、必须采用的环境隔离方式。
按环境定义独立的配置类或 Bean 方法
把不同环境专用的组件(如数据源、客户端、初始化器)拆开,各自标注对应 profile:
- 用
@Configuration类 +@Profile("dev")控制整组 Bean 的加载 - 或直接在
@Bean方法上加@Profile("test"),更细粒度 - 避免在一个方法里写
if ("prod".equals(profile)) { ... }—— 这会导致所有 Bean 都被创建,只是没注入,浪费资源且易出错
Profile 名称要规范,且必须启动时指定
名称建议全小写、无下划线、无连字符(如 dev、test、prod),否则可能抛 IllegalArgumentException。激活方式优先级从高到低为:
- 命令行参数:
java -jar app.jar --spring.profiles.active=prod - JVM 参数:
-Dspring.profiles.active=test - 系统环境变量:
export SPRING_PROFILES_ACTIVE=dev -
application.properties中设置(仅限开发阶段,生产禁用)
注意:不能在代码里动态判断 profile 值再决定行为,这会破坏配置的可测试性与可部署性。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
配合 application-{profile}.yml 实现配置与 Bean 双重隔离
Bean 的隔离靠 @Profile,配置的隔离靠命名文件。例如:
-
application-dev.yml中配 H2 数据库地址、DEBUG 日志级别 -
application-prod.yml中配 MySQL 地址、INFO 级别、关闭调试端点 - 敏感信息(密码、密钥)一律不写进 yml,改用
${DB_PASSWORD}占位符,由环境变量或配置中心提供
Spring Boot 启动时自动识别并合并 application.yml(通用)+ application-{active}.yml(专属)。
慎用否定表达式,多 profile 组合需明确语义
@Profile("!prod") 表示“非生产环境”,看似方便,但若同时激活 prod,debug,该条件仍为 true,容易误触发。推荐显式声明:
- 需要开发/测试共用的 Bean,写成
@Profile({"dev", "test"}) - 预发布环境(staging)应单独建 profile,不要混入 prod 或 test 逻辑
- 组合激活如
--spring.profiles.active=test,mysql可行,但生产环境建议只用单一核心 profile,避免依赖关系模糊










