Spring Boot 中的条件注解

Spring Boot条件注解的汇总:

注解 作用 判断依据 使用场景
@ConditionalOnBean 容器中存在指定Bean时,被注解的配置或Bean定义生效 指定Bean在容器中存在 依赖其他已存在Bean时配置相关功能
@ConditionalOnCheckpointRestore 在特定检查点恢复相关条件满足时生效 满足检查点恢复条件 Spring Boot内部特定恢复机制场景
@ConditionalOnClass 类路径下存在指定类时,相关配置或Bean定义生效 指定类在类路径中存在 确保依赖类存在才进行配置
@ConditionalOnCloudPlatform 根据运行的云平台判断条件是否满足 处于指定云平台环境 针对不同云平台进行差异化配置
@ConditionalOnExpression 基于SpEL表达式结果判断条件是否满足 SpEL表达式计算结果为真 根据灵活的表达式逻辑决定配置
@ConditionalOnJava 依据当前运行的Java版本判断条件 运行的Java版本符合指定范围 兼容不同Java版本的配置
@ConditionalOnJndi JNDI中存在指定名称时,配置或Bean定义生效 JNDI存在指定名称 依赖JNDI资源进行配置
@ConditionalOnMissingBean 容器中不存在指定Bean时,配置或Bean定义生效 指定Bean在容器中不存在 容器缺少特定Bean时提供默认配置
@ConditionalOnMissingClass 类路径下不存在指定类时,配置或Bean定义生效 指定类在类路径中不存在 类路径缺少特定类时进行替代配置
@ConditionalOnNotWarDeployment 应用不是以WAR包形式部署时,配置或Bean定义生效 非WAR包部署形式 非WAR包部署场景下的配置
@ConditionalOnNotWebApplication 应用不是Web应用程序时,配置或Bean定义生效 非Web应用程序 非Web应用场景下的配置
@ConditionalOnProperty 根据配置文件中的属性值判断条件 配置属性值满足要求 依据配置文件灵活启用或禁用配置
@ConditionalOnResource 类路径下存在指定资源时,配置或Bean定义生效 类路径存在指定资源 依赖特定资源存在的配置
@ConditionalOnSingleCandidate 容器中指定类型的Bean只有一个候选时,配置或Bean定义生效 指定类型Bean为单例 确保单例Bean存在时的配置
@ConditionalOnThreading 基于线程相关条件判断 满足线程相关条件 Spring Boot内部特定线程场景
@ConditionalOnWarDeployment 应用是以WAR包形式部署时,配置或Bean定义生效 WAR包部署形式 WAR包部署场景下的配置
@ConditionalOnWebApplication 应用是Web应用程序时,配置或Bean定义生效 Web应用程序 Web应用场景下的配置

@ConditionalOnBean

意义:表示当容器中存在指定类型或满足特定条件的 Bean 时,才会使被注解的配置生效或创建对应的 Bean。
使用示例:
java 复制代码
@Configuration
@ConditionalOnBean(name = "userService") 
public class SpecialConfig {
    // 当容器中存在名为userService的Bean时,该配置类才生效
}

@ConditionalOnClass

意义:当类路径下存在指定的类时,被注解的配置或 Bean 定义才会生效。用于确保依赖类存在时才进行相关配置。
使用示例:
java 复制代码
@Configuration
@ConditionalOnClass(name = "org.example.SomeService") 
public class FeatureConfig {
    // 当类路径下存在org.example.SomeService类时,该配置类生效
}

@ConditionalOnExpression

意义:基于 SpEL(Spring 表达式语言)表达式的结果来判断条件是否满足。可以灵活地根据表达式逻辑决定配置是否生效。
使用示例
java 复制代码
@Configuration
@ConditionalOnExpression("${app.debug:false} == true") 
public class DebugConfig {
    // 当配置文件中app.debug为true时,该配置类生效
}

@ConditionalOnJava

意义:根据当前运行的 Java 版本来判断条件是否满足,用于兼容不同 Java 版本的配置。

使用示例:

java 复制代码
@Configuration
@ConditionalOnJava(range = ConditionalOnJava.Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT) 
public class Java8PlusConfig {
    // 当运行环境为Java 8或更高版本时,该配置类生效
}

@ConditionalOnJndi

意义:当 JNDI(Java 命名和目录接口)中存在指定的名称时,被注解的配置或 Bean 定义才会生效。
使用示例:
java 复制代码
@Configuration
@ConditionalOnJndi(name = "java:comp/env/jdbc/myDS") 
public class JndiDataSourceConfig {
    // 当JNDI中存在指定名称的数据源时,该配置类生效
}

@ConditionalOnMissingBean

意义:当容器中不存在指定类型或满足特定条件的 Bean 时,才会使被注解的配置生效或创建对应的 Bean。和@ConditionalOnBean 相反。
使用示例:
java 复制代码
@Configuration
@ConditionalOnMissingBean(UserService.class) 
public class DefaultUserServiceConfig {
    // 当容器中不存在UserService类型的Bean时,创建默认的UserService Bean
}

@ConditionalOnMissingClass

意义:当类路径下不存在指定的类时,被注解的配置或 Bean 定义才会生效。和@ConditionalOnClass 相反。
使用示例:
java 复制代码
@Configuration
@ConditionalOnMissingClass(name = "org.example.ExpensiveLibrary") 
public class FallbackConfig {
    // 当类路径下不存在org.example.ExpensiveLibrary类时,该配置类生效
}

@ConditionalOnNotWarDeployment

意义:当应用不是以 WAR 包形式部署时,被注解的配置或 Bean 定义才会生效。
使用示例:
java 复制代码
@Configuration
@ConditionalOnNotWarDeployment
public class NonWarDeploymentConfig {
    // 非WAR包部署时,该配置类生效
}

@ConditionalOnNotWebApplication

意义:当应用不是 Web 应用程序时,被注解的配置或 Bean 定义才会生效。
使用示例:
java 复制代码
@Configuration
@ConditionalOnNotWebApplication
public class NonWebAppConfig {
    // 非Web应用场景下,该配置类生效
}

@ConditionalOnProperty

意义:根据配置文件中的属性值来判断条件是否满足。可用于根据配置灵活启用或禁用配置。

使用示例:
java 复制代码
@Configuration
@ConditionalOnProperty(name = "app.feature.enable", havingValue = "true") 
public class FeatureEnableConfig {
    // 当配置文件中app.feature.enable属性值为true时,该配置类生效
}

@ConditionalOnResource

意义:当类路径下存在指定的资源(如文件、目录等)时,被注解的配置或 Bean 定义才会生效。
使用示例:
java 复制代码
@Configuration
@ConditionalOnResource(resources = "classpath:config/custom.properties") 
public class CustomResourceConfig {
    // 当类路径下存在config/custom.properties文件时,该配置类生效
}

@ConditionalOnSingleCandidate

意义:当容器中指定类型的 Bean 只有一个候选(即单例)时,被注解的配置或 Bean 定义才会生效。
使用示例:
java 复制代码
@Configuration
@ConditionalOnSingleCandidate(UserService.class) 
public class SingleUserServiceConfig {
    // 当容器中UserService类型的Bean只有一个时,该配置类生效
}

@ConditionalOnThreading

意义:基于线程相关条件判断,Spring Boot 内部特定场景使用,应用开发中较少直接用。
使用示例:
java 复制代码
@Configuration
@ConditionalOnThreading
public class ThreadingRelatedConfig {
    // 满足线程相关条件时,配置生效
}

@ConditionalOnWarDeployment

意义:当应用是以 WAR 包形式部署时,被注解的配置或 Bean 定义才会生效。
使用示例:
java 复制代码
@Configuration
@ConditionalOnWarDeployment
public class WarDeploymentConfig {
    // WAR包部署时,该配置类生效
}

@ConditionalOnWebApplication

意义:当应用是 Web 应用程序时,被注解的配置或 Bean 定义才会生效。
使用示例:
java 复制代码
@Configuration
@ConditionalOnWebApplication
public class WebAppConfig {
    // 作为Web应用时,该配置类生效
}

@ConditionalOnCloudPlatform

意义:根据运行的云平台来判断条件是否满足,比如判断是否在特定云厂商(如 AWS、Azure 等)环境中运行,以决定配置是否生效。
使用示例:
java 复制代码
@Configuration
@ConditionalOnCloudPlatform(value = CloudPlatform.AWS) 
public class AwsSpecificConfig {
    // 运行在AWS云平台时,该配置类生效
}

@ConditionalOnCheckpointRestore

意义:Spring Boot 特定场景下,基于检查点恢复相关条件判断,一般用于 Spring Boot 内部或特定恢复机制场景 ,应用开发中较少直接使用。
使用示例:
java 复制代码
@Configuration
@ConditionalOnCheckpointRestore
public class RestoreRelatedConfig {
    // 满足检查点恢复条件时,配置生效
}
相关推荐
百锦再15 分钟前
Android Studio开发中Application和Activity生命周期详解
android·java·ide·app·gradle·android studio·studio
大G哥18 分钟前
Java 中的 Integer 缓存池:背后的性能优化机制解析
java·开发语言·缓存·性能优化
不爱总结的麦穗22 分钟前
面试常问!Spring七种事务传播行为一文通关
后端·spring·面试
CN.LG22 分钟前
IntelliJ IDEA 内存优化
java·ide·intellij-idea
笨蛋不要掉眼泪25 分钟前
SpringMVC再复习1
java·spring·mvc
小虚竹39 分钟前
claude 3.7,极为均衡的“全能型战士”大模型,国内直接使用
开发语言·后端·claude·claude3.7
苹果酱056744 分钟前
python3语言基础语法整理
java·vue.js·spring boot·mysql·课程设计
牛马baby1 小时前
Java高频面试之并发编程-11
java·开发语言·面试
Yharim1 小时前
两个客户端如何通过websocket通信
spring boot·后端·websocket
bcbnb1 小时前
iOS 性能调优实战:三款工具横向对比实测(含 Instruments、KeyMob、Xlog)
后端