Spring Boot 条件装配核心解析:@Conditional 到 @ConditionalOnXXX 一文打通

张开发
2026/4/19 20:00:37 15 分钟阅读

分享文章

Spring Boot 条件装配核心解析:@Conditional 到 @ConditionalOnXXX 一文打通
一、前言在学习 Spring Boot 的过程中你一定见过这些注解ConditionalOnPropertyConditionalOnClassConditionalOnMissingBean很多人会用但不理解本质。而当你看到Conditional就会懵❓ 这个是干嘛的和 OnXXX 有什么关系 这篇文章帮你彻底搞清楚Conditional 是什么ConditionalOnXXX 本质是什么实战如何使用什么时候该用哪个二、一句话核心结论先记住✅Conditional 是底层机制✅ConditionalOnXXX 是封装好的常用条件三、整体结构必须建立的认知【日常开发】↓ConditionalOnPropertyConditionalOnClassConditionalOnMissingBean↓【Spring Boot 封装】↓这些注解本质 Conditional 条件类↓【底层机制】↓Conditional可自定义规则四、Conditional 是什么 本质控制 Bean 是否加载的“开关机制” 核心接口public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);} 关键点return true; // 加载 Beanreturn false; // 不加载五、最小实战示例必会 场景只有 Windows 才加载 Bean1️⃣ 自定义条件类public class WindowsCondition implements Condition {Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {String os System.getProperty(os.name);return os.contains(Windows);}}2️⃣ 使用 ConditionalConfigurationpublic class MyConfig {BeanConditional(WindowsCondition.class)public String helloBean() {return Hello Windows;}}3️⃣ 结果环境结果WindowsBean 存在Mac/LinuxBean 不存在六、ConditionalOnXXX 本质解析你常用的这些ConditionalOnPropertyConditionalOnClass 本质都是Conditional(某个 Condition 实现类)1️⃣ ConditionalOnClass 判断类是否存在ConditionalOnClass(name com.mysql.Driver)等价于try {Class.forName(com.mysql.Driver);return true;} catch (Exception e) {return false;}2️⃣ ConditionalOnProperty 根据配置开关控制feature.enabletrueConditionalOnProperty(name feature.enable, havingValue true)等价于return environment.getProperty(feature.enable).equals(true);七、实战场景企业真实用法 场景缓存模块开关控制1️⃣ 配置app.cache.enabletrue2️⃣ 使用BeanConditionalOnProperty(name app.cache.enable, havingValue true)public CacheService cacheService() {return new RedisCacheService();}3️⃣ 效果配置结果true启用缓存false关闭缓存 这就是典型的功能开关Feature Toggle八、什么时候用 Conditional✅ 用 ConditionalOnXXX99%情况ConditionalOnPropertyConditionalOnClassConditionalOnMissingBean 足够解决大部分问题❗ 只有这种情况才用 Conditional 当你需要多条件组合判断动态逻辑复杂 if非配置类条件比如外部系统例如Conditional(MyCustomCondition.class)九、Android 思维类比非常重要如果你是 Android 开发这样理解SpringAndroidConditionalOnPropertybuildConfig 开关ConditionalOnClass依赖判断Conditional自己写 if 逻辑 类似if (BuildConfig.DEBUG) {// 加载调试模块}十、架构级认知面试加分点Conditional 是 Spring Boot 自动装配的核心扩展点也就是说 所有 starter 的本质就是条件成立 → 自动加载配置条件不成立 → 不加载十一、终极总结Conditional 自定义规则底层能力ConditionalOnXXX 官方封装推荐使用业务开发 → 用 OnXXX框架开发 → 用 Conditional十二、下一步建议非常关键你已经到这个阶段了✅ 会用 Spring Boot✅ 开始理解自动装配机制 下一步必须做 手写一个 starter包括自动配置类ConditionalOnPropertyConditionalOnClass可开关功能模块 最后一击总结Spring Boot 的本质不是“帮你写代码”而是“帮你决定什么时候加载代码”。如果你要我下一步可以直接带你做一个 完整可运行的 starter带开关 自动装配 日志模块这个做完你这一块直接从会用 → 会讲 → 会设计框架

更多文章