Spring Boot 核心机制之 @Conditional:从原理到实战(一次讲透)

张开发
2026/4/18 16:16:18 15 分钟阅读

分享文章

Spring Boot 核心机制之 @Conditional:从原理到实战(一次讲透)
在使用 Spring Boot 的过程中很多人会接触到ConditionalConditionalOnPropertyConditionalOnClass但往往只是“会用”却不知道它到底解决什么问题。这篇文章帮你彻底搞清楚Conditional 到底是什么、什么时候触发、怎么用、适合用在哪一、什么是 Conditional本质一句话Conditional 条件装配机制根据条件决定某个 Bean 是否被加载到 Spring 容器中二、先纠正一个常见误区非常重要很多人第一反应是❌ 用来做环境切换dev / test / prod 这是不准确的正确分工是功能用什么多环境切换Profile条件装配Conditional 举个对比环境切换ProfileProfile(dev) Bean public ApiService mockApi() {}条件控制ConditionalBean ConditionalOnProperty(name feature.pay-enabled, havingValue true) public PayService payService() {} 总结一句Profile 控制“在哪个环境生效”Conditional 控制“这个功能有没有”三、Conditional 在启动流程中的位置核心Spring 启动流程中扫描类 ↓ 解析配置类 ↓ ⭐ 执行 Conditional 判断 ↓ 注册 BeanDefinition ↓ 创建 Bean 关键点❗Conditional 发生在“Bean 创建之前”更准确一点扫描到类↓检查 Conditional↓true → 注册 BeanDefinitionfalse → 直接跳过相当于不存在四、核心原理你必须理解Conditional本质是Conditional(XXXCondition.class)你要实现一个类public class MyCondition implements Condition { Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return true; // true 加载false 不加载 } } 这个matches()决定返回值结果true加载 Beanfalse不加载五、最常用的几个注解你实际用这些Spring Boot 已经帮你封装好了1️⃣ ConditionalOnProperty最常用 ⭐Bean ConditionalOnProperty(name feature.pay-enabled, havingValue true) public PayService payService() {}yamlfeature: pay-enabled: true 作用配置开关控制功能是否开启2️⃣ ConditionalOnClassConditionalOnClass(name com.mysql.cj.jdbc.Driver) 用于自动配置判断依赖是否存在3️⃣ ConditionalOnMissingBeanConditionalOnMissingBean(PayService.class) 如果没有 Bean 才创建避免覆盖六、典型使用场景企业真实用法✅ 1. 功能开关最常见feature: sms-enabled: falseConditionalOnProperty(name feature.sms-enabled, havingValue true) Bean public SmsService smsService() {} 效果false → 系统没有短信功能true → 才有✅ 2. 第三方接入控制pay: wechat-enabled: trueConditionalOnProperty(name pay.wechat-enabled, havingValue true) Bean public WechatPayService wechatPayService() {}✅ 3. 自动配置Spring Boot 核心机制AutoConfigurationConditionalOnClass(DataSource.class) Spring Boot 就是这么“按需加载”的七、一个非常关键的理解必须记住Conditional 不是权限控制❌ 错误理解用户是 VIP → 用 Conditional 控制 ❌✅ 正确做法第一层系统能力Conditional系统有没有 VIP 功能第二层用户权限业务代码if (user.isVip()) { vipService.use(); } 总结Conditional 控制“系统有没有功能”不是“用户能不能用”八、和 Android 的对比帮助理解AndroidSpringFlavorProfileBuildConfigEnvironmentif 判断Conditional不同 APK不同 Bean 本质差异类型时机Android Flavor编译期Spring Conditional运行期启动时九、实战推荐写法你可以直接用feature:pay-enabled: truesms-enabled: falsevip-enabled: trueConditionalOnProperty(name feature.pay-enabled, havingValue true) Bean public PayService payService() {} 搭配Autowired(required false) private PayService payService;十、面试标准回答直接背Conditional 是 Spring 的条件装配机制在容器启动时根据条件决定 Bean 是否注册。它通常用于功能开关、自动配置以及第三方组件加载。与 Profile 不同Profile 主要用于环境切换而 Conditional 更偏向于控制系统能力是否存在。十一、总结最重要Conditional 的本质↓控制 Bean 是否存在发生时机↓容器启动 → 注册 BeanDefinition 阶段适用场景↓功能开关 / 自动配置 / 模块控制不适用↓用户权限判断核心理解Conditional 不是控制“执行不执行” 而是控制这个 Bean 在系统里“有没有”下一篇AOP 日志 traceId 完整链路追踪企业级模板内容包括请求唯一 traceIdAOP 自动打印日志日志贯穿 Controller → Service → DB出问题一条链路查到底

更多文章