Spring 及 Spring Boot 条件化注解(15个)完整列表及示例


Spring 及 Spring Boot 条件化注解完整列表及示例


1. 所有条件化注解列表

Spring 和 Spring Boot 提供了以下条件化注解(共 15 个),用于在配置类或方法上实现条件化注册 Bean 或配置:

注解名称 作用 来源框架
@Conditional 自定义条件逻辑。 Spring Core
@ConditionalOnClass 类路径存在指定类时触发。 Spring Core
@ConditionalOnMissingClass 类路径不存在指定类时触发。 Spring Core
@ConditionalOnBean 指定 Bean 存在时触发。 Spring Core
@ConditionalOnMissingBean 指定 Bean 不存在时触发。 Spring Core
@ConditionalOnExpression SpEL 表达式为 true 时触发。 Spring Core
@ConditionalOnJava 当前 Java 版本满足条件时触发。 Spring Core
@ConditionalOnProperty 配置属性存在且符合指定值时触发。 Spring Core
@ConditionalOnResource 类路径存在指定资源文件时触发。 Spring Boot
@ConditionalOnWebApplication 当应用是 Web 应用时触发。 Spring Boot
@ConditionalOnNotWebApplication 当应用不是 Web 应用时触发。 Spring Boot
@ConditionalOnSingleCandidate 指定类型只有一个候选 Bean 或类型匹配时触发。 Spring Boot
@ConditionalOnJndi JNDI 资源存在时触发。 Spring Boot
@ConditionalOnMissingJndi JNDI 资源不存在时触发。 Spring Boot
@ConditionalOnCloudPlatform 当运行在指定云平台(如 AWS、Azure)时触发。 Spring Cloud

2. 完整代码示例
(1) @Conditional(自定义条件)

作用 :通过实现 Condition 接口自定义条件逻辑。

java 复制代码
// 自定义条件类
public class CustomCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().containsProperty("custom.key");
    }
}

// 配置类
@Configuration
@Conditional(CustomCondition.class) // 自定义条件
public class CustomConditionConfig {
    @Bean
    public String customConditionBean() {
        return "Bean created by custom condition";
    }
}

// 测试类
@SpringBootTest(properties = "custom.key=true")
class CustomConditionTest {
    @Autowired(required = false)
    private String customConditionBean;

    @Test
    void testWithCustomKey() {
        assertNotNull(customConditionBean);
    }
}

(2) @ConditionalOnClass

作用:类路径存在指定类时触发。

java 复制代码
@Configuration
@ConditionalOnClass(DataSource.class) // 当存在 DataSource 类时触发
public class ClassConditionConfig {
    @Bean
    public String dataSourceBean() {
        return "DataSource exists";
    }
}

(3) @ConditionalOnMissingClass

作用:类路径不存在指定类时触发。

java 复制代码
@Configuration
@ConditionalOnMissingClass("org.springframework.jdbc.datasource.DataSource") // 当无 DataSource 类时触发
public class MissingClassConditionConfig {
    @Bean
    public String noDataSourceBean() {
        return "DataSource does NOT exist";
    }
}

(4) @ConditionalOnBean

作用:指定 Bean 存在时触发。

java 复制代码
@Configuration
@ConditionalOnBean(name = "dataSource") // 当存在 dataSource Bean 时触发
public class BeanConditionConfig {
    @Bean
    public String dataSourceDependentBean() {
        return "Bean created because dataSource exists";
    }
}

(5) @ConditionalOnMissingBean

作用:指定 Bean 不存在时触发。

java 复制代码
@Configuration
public class MissingBeanConditionConfig {
    @Bean
    @ConditionalOnMissingBean(name = "myBean") // 当无 myBean 时触发
    public String missingBean() {
        return "Bean created because 'myBean' is missing";
    }
}

(6) @ConditionalOnExpression

作用 :SpEL 表达式为 true 时触发。

java 复制代码
@Configuration
@ConditionalOnExpression("${app.env} == 'prod'") // 当 env 为 prod 时触发
public class ExpressionConditionConfig {
    @Bean
    public String prodBean() {
        return "Bean for prod environment";
    }
}

(7) @ConditionalOnJava

作用:Java 版本满足条件时触发。

java 复制代码
@Configuration
@ConditionalOnJava(baseline = JavaVersion.EIGHT, fallback = JavaVersion.TEN) // Java 8-10 时触发
public class JavaVersionConditionConfig {
    @Bean
    public String java8To10Bean() {
        return "Java 8-10 compatible";
    }
}

(8) @ConditionalOnProperty

作用:配置属性存在且符合指定值时触发。

java 复制代码
@Configuration
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true") // 当 feature.enabled 为 true 时触发
public class PropertyConditionConfig {
    @Bean
    public String enabledFeatureBean() {
        return "Feature enabled";
    }
}

(9) @ConditionalOnResource

作用:类路径存在指定资源文件时触发(Spring Boot)。

java 复制代码
@Configuration
@ConditionalOnResource(resources = "classpath:config/application-prod.properties") // 当资源存在时触发
public class ResourceConditionConfig {
    @Bean
    public String prodResourceBean() {
        return "Resource exists";
    }
}

(10) @ConditionalOnWebApplication

作用:应用是 Web 应用时触发(Spring Boot)。

java 复制代码
@Configuration
@ConditionalOnWebApplication // Web 应用时触发
public class WebConditionConfig {
    @Bean
    public String webBean() {
        return "Web application";
    }
}

(11) @ConditionalOnNotWebApplication

作用:应用不是 Web 应用时触发(Spring Boot)。

java 复制代码
@Configuration
@ConditionalOnNotWebApplication // 非 Web 应用时触发
public class NonWebConditionConfig {
    @Bean
    public String nonWebBean() {
        return "Non-web application";
    }
}

(12) @ConditionalOnSingleCandidate

作用:指定类型只有一个候选 Bean 时触发(Spring Boot)。

java 复制代码
@Configuration
@ConditionalOnSingleCandidate(DataSource.class) // 当唯一 DataSource 存在时触发
public class SingleCandidateConditionConfig {
    @Bean
    public String singleDataSourceBean() {
        return "Single DataSource candidate";
    }
}

(13) @ConditionalOnJndi

作用:JNDI 资源存在时触发(Spring Boot)。

java 复制代码
@Configuration
@ConditionalOnJndi("java:comp/env/jdbc/MyDB") // 当 JNDI 资源存在时触发
public class JndiConditionConfig {
    @Bean
    public String jndiBean() {
        return "JNDI resource exists";
    }
}

(14) @ConditionalOnMissingJndi

作用:JNDI 资源不存在时触发(Spring Boot)。

java 复制代码
@Configuration
@ConditionalOnMissingJndi("java:comp/env/jdbc/MyDB") // 当 JNDI 资源不存在时触发
public class MissingJndiConditionConfig {
    @Bean
    public String noJndiBean() {
        return "JNDI resource does NOT exist";
    }
}

(15) @ConditionalOnCloudPlatform

作用:运行在指定云平台时触发(Spring Cloud)。

java 复制代码
@Configuration
@ConditionalOnCloudPlatform(Azure.class) // 当运行在 Azure 时触发
public class CloudConditionConfig {
    @Bean
    public String azureBean() {
        return "Bean for Azure environment";
    }
}

3. 条件注解对比表
注解 触发条件 典型场景 参数示例 来源框架
@Conditional 自定义 Condition 接口实现的逻辑。 灵活的自定义条件。 @Conditional(CustomCondition.class) Spring Core
@ConditionalOnClass 类路径存在指定类。 检测依赖是否存在。 @ConditionalOnClass(DataSource.class) Spring Core
@ConditionalOnMissingClass 类路径不存在指定类。 检测依赖缺失。 @ConditionalOnMissingClass("DataSource") Spring Core
@ConditionalOnBean 指定 Bean 存在。 依赖其他 Bean 的存在。 @ConditionalOnBean(name = "dataSource") Spring Core
@ConditionalOnMissingBean 指定 Bean 不存在。 避免重复注册 Bean。 @ConditionalOnMissingBean(name = "myBean") Spring Core
@ConditionalOnExpression SpEL 表达式为 true 复杂条件判断。 @ConditionalOnExpression("${app.env} == 'prod'") Spring Core
@ConditionalOnJava 当前 Java 版本满足条件。 根据 Java 版本启用功能。 @ConditionalOnJava(baseline = JavaVersion.EIGHT) Spring Core
@ConditionalOnProperty 配置属性存在且符合指定值。 根据配置启用功能。 @ConditionalOnProperty(name = "feature.enabled", havingValue = "true") Spring Core
@ConditionalOnResource 类路径存在指定资源文件。 根据资源文件存在与否配置。 @ConditionalOnResource("classpath:config/prod.properties") Spring Boot
@ConditionalOnWebApplication 应用是 Web 应用。 Web 相关配置。 @ConditionalOnWebApplication Spring Boot
@ConditionalOnNotWebApplication 应用不是 Web 应用。 非 Web 应用配置。 @ConditionalOnNotWebApplication Spring Boot
@ConditionalOnSingleCandidate 指定类型只有一个候选 Bean 或类型匹配。 确保唯一 Bean。 @ConditionalOnSingleCandidate(DataSource.class) Spring Boot
@ConditionalOnJndi JNDI 资源存在。 根据 JNDI 资源触发配置。 @ConditionalOnJndi("java:comp/env/jdbc/MyDB") Spring Boot
@ConditionalOnMissingJndi JNDI 资源不存在。 根据 JNDI 缺失触发配置。 @ConditionalOnMissingJndi("java:comp/env/jdbc/MyDB") Spring Boot
@ConditionalOnCloudPlatform 运行在指定云平台(如 AWS、Azure)。 云平台相关配置。 @ConditionalOnCloudPlatform(Azure.class) Spring Cloud

4. 总结

Spring 及 Spring Boot 的条件化注解通过 条件判断 实现配置的动态加载,核心是 Condition 接口和其衍生注解。关键点如下:

  • 依赖检测@ConditionalOnClass@ConditionalOnMissingClass@ConditionalOnJndi
  • Bean 状态@ConditionalOnBean@ConditionalOnMissingBean@ConditionalOnSingleCandidate
  • 属性/环境@ConditionalOnProperty@ConditionalOnExpression@ConditionalOnJava
  • 应用类型@ConditionalOnWebApplication@ConditionalOnNotWebApplication
  • 云平台@ConditionalOnCloudPlatform(Spring Cloud)。
  • 自定义条件 :通过 @Conditional 实现灵活扩展。

这些注解帮助开发者根据运行时环境、依赖、配置等条件动态注册 Bean,减少硬编码,提升代码的灵活性和可维护性。例如:

  • Spring Boot 的 @ConditionalOnResource 可用于根据配置文件是否存在来启用功能。
  • @ConditionalOnCloudPlatform 可在不同云平台(如 AWS、Azure)间切换配置。
  • @ConditionalOnJndi 适用于需要 JNDI 资源的环境(如企业级应用服务器)。

根据具体需求选择合适的注解,可显著简化配置逻辑并增强代码的适应性。

相关推荐
安然无虞6 分钟前
31天Python入门——第17天:初识面向对象
后端·爬虫·python·职场和发展
程序员小远19 分钟前
Python+requests实现接口自动化测试框架
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
A叶子叶26 分钟前
Kong网关部署研究
python·spring cloud·微服务·gateway·kong
编程、小哥哥27 分钟前
spring之添加freemarker模版熏染
java·后端·spring
聪明的墨菲特i33 分钟前
Python 办公技巧:PDF 自动化处理
python·pdf·自动化
hong_zc36 分钟前
Spring 拦截器与统一功能的处理
java·后端·spring
Ronin-Lotus39 分钟前
深度学习篇---模型参数调优
人工智能·pytorch·python·深度学习·paddlepaddle·batch·学习率
林泽毅2 小时前
SwanLab硬件监控:英伟达、昇腾、寒武纪
python·深度学习·昇腾·英伟达·swanlab·寒武纪·训练实战
小哲慢慢来3 小时前
解决auto_gptq安装问题
python
奔跑草-3 小时前
【服务端】使用conda虚拟环境部署Django项目
python·django·conda