@Conditional 注解通过封装环境判断逻辑到 Condition 类或使用内置注解(如@Profile、@ConditionalOnProperty、@ConditionalOnCloudPlatform)实现 Bean 或配置类的条件加载,支持 profile、配置属性、操作系统、JVM 版本及云平台等多维度动态控制。

Spring 的 @Conditional 注解可以根据运行环境(如 profile、系统属性、操作系统等)动态决定是否加载某个 Bean 或配置类。核心思路是:把“环境判断逻辑”封装进 Condition 实现类,再通过 @Conditional 关联到目标组件上。
用 @Profile + @ConditionalOnProperty 快速按 profile 控制
最常用也最轻量的方式是结合 Spring Boot 内置注解,无需手写 Condition 类:
-
@Profile("dev")直接限定仅在 dev 环境生效(需启动时指定--spring.profiles.active=dev) -
@ConditionalOnProperty(name = "app.env", havingValue = "test")根据配置项值判断,比如application.yml中写app.env: test - 两者可组合使用:
@Profile("prod") @ConditionalOnProperty("cache.enabled"),表示只在 prod 环境且 cache.enabled 为 true 时才加载
自定义 Condition 判断系统或 JVM 环境
当内置注解不够用(比如要检查操作系统类型、JVM 版本、特定环境变量),就自己写 Condition:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 实现
org.springframework.context.annotation.Condition接口,重写matches() - 通过
context.getEnvironment()获取 profiles、properties;用System.getProperty("os.name")拿系统名;System.getProperty("java.version")查 JVM 版本 - 例如判断是否 Linux 系统:
return osName != null && osName.toLowerCase().contains("linux");
配合 @Configuration 类做环境隔离配置
把整组 Bean 封装在一个配置类里,统一加条件控制更清晰:
立即学习“Java免费学习笔记(深入)”;
- 给
@Configuration类标注@Conditional(DevEnvironmentCondition.class),该类下所有@Bean都受同一条件约束 - 适合多环境数据源、日志策略、Mock 服务等场景,避免每个 Bean 单独加注解
- 注意:条件类必须是无状态的,不能依赖 Spring 容器中尚未初始化的 Bean
@ConditionalOnCloudPlatform 检测云平台环境
Spring Boot 提供了开箱即用的云环境判断:
-
@ConditionalOnCloudPlatform(CloudPlatform.AWS)—— 只在 AWS 环境生效 -
@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES)—— 适用于容器编排场景 - 它会自动检测环境变量(如
KUBERNETES_SERVICE_HOST)、系统属性和类路径特征

















