Spring Boot 条件注解全解析:核心机制与使用场景
本文系统梳理了 Spring Boot 条件注解的核心机制与常用类型。通过 @Conditional 及其扩展注解(如@ConditionalOnClass、@ConditionalOnBean 等),开发者可根据类路径、Bean 存在性、配置属性等动态控制 Bean 加载。文章结合代码示例讲解了各注解的作用与场景,并分析了底层原理及组合用法,帮助构建灵活的自动配置逻辑。

本文系统梳理了 Spring Boot 条件注解的核心机制与常用类型。通过 @Conditional 及其扩展注解(如@ConditionalOnClass、@ConditionalOnBean 等),开发者可根据类路径、Bean 存在性、配置属性等动态控制 Bean 加载。文章结合代码示例讲解了各注解的作用与场景,并分析了底层原理及组合用法,帮助构建灵活的自动配置逻辑。

Spring Boot 的条件注解(Conditional Annotations)是自动配置的核心机制之一。它们允许开发者根据特定的条件动态决定是否加载某个 Bean 或配置类,从而实现灵活的'按需配置'。本文将系统梳理所有常用的条件注解,结合代码示例说明其作用与使用场景。
元注解:@Conditional 作为所有条件注解的基础,通过实现 Condition 接口的 matches() 方法进行条件判断。若条件满足,则 Bean 或配置类生效;否则跳过。
示例:自定义条件类检查 JdbcTemplate 是否存在
public class JdbcTemplateCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return ClassUtils.isPresent("org.springframework.jdbc.core.JdbcTemplate", context.getClassLoader());
}
}
Spring Boot 基于 @Conditional 扩展了以下常用注解,覆盖了大多数自动化配置场景。
@Configuration
@ConditionalOnClass({DataSource.class, EntityManager.class})
public class JpaAutoConfiguration {
// 当类路径存在 DataSource 和 EntityManager 时生效
}
@Bean
@ConditionalOnMissingBean(DataSource.class)
public DataSource defaultDataSource() {
return new HikariDataSource();
}
@Configuration
@ConditionalOnProperty(name = "app.cache.enabled", havingValue = "true")
public class CacheConfig {
// 当 app.cache.enabled=true 时加载
}
@Configuration
@ConditionalOnWebApplication
public class WebMvcConfig {
// 仅在 Web 环境中生效
}
@Bean
@ConditionalOnExpression("${app.feature.enabled} && T(com.example.SomeClass).isAvailable()")
public FeatureBean featureBean() {
return new FeatureBean();
}
@Configuration
@ConditionalOnResource(resources = "classpath:config-override.properties")
public class OverrideConfig {
// 当类路径存在该文件时生效
}
@Configuration
@ConditionalOnJava(range = ConditionalOnJava.Range.EQUAL_OR_NEWER, value = JavaVersion.ELEVEN)
public class Java11Config {
// Java 11+ 环境下生效
}
@Bean
@ConditionalOnSingleCandidate(DataSource.class)
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Configuration
@ConditionalOnClass({RedisClient.class})
@ConditionalOnProperty(name = "app.redis.enabled", matchIfMissing = true)
public class RedisAutoConfig {
// 当 RedisClient 存在且配置开启(或未配置)时生效
}
Spring Boot 在启动时,通过条件注解解析器(如 ConditionEvaluator)扫描所有配置类,结合以下步骤实现条件装配
Spring Boot 的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键。通过合理组合这些注解,可以实现'智能'的自动配置逻辑,同时避免冗余代码。实际开发中,建议结合 Spring Boot 的自动配置源码(如 spring-boot-autoconfigure 模块)深入学习。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online