SpringBoot22-@Conditional条件装配
一、解释ConditionalConditional的作用是只有在满足某个条件时才把这个 Bean 放进 Spring 容器里。不满足条件 → 不装配满足条件 → 才装配你可以理解为if (条件满足) { 把这个 Bean 交给 Spring 管理 } else { 不要管它 }1、例子你有一个 BeanBean public UserService userService() { return new UserService(); }现在你想让这个 Bean只有在某个条件成立时才生效。加ConditionalBean Conditional(MyCondition.class) // ✅ 在某个条件成立时才注册 public UserService userService() { return new UserService(); }MyCondition是你写的“判定逻辑”类public class MyCondition implements Condition { Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 返回 true装配 // 返回 false不装配 return true; // 你可以加自己的判断逻辑 } }2、这在什么时候特别有用场景示例说明根据系统环境选择 BeanWindows vs LinuxWindows 用 A BeanLinux 用 B Bean根据配置文件开关启用功能my.feature.enabledtrue开关功能模块判断类是否存在Class.forName(...)例如自动配置第三方库时根据是否存在某个 Bean条件注入避免重复装配、冲突二、现成的条件注解Spring Boot 已经提供了很多现成的条件注解不用自己写Condition注解意义示例ConditionalOnClass某个类存在才装配缓存模块依赖 Redis 才启动ConditionalOnMissingClass某个类不存在才装配防止重复ConditionalOnBean容器里存在某 Bean 才装配依赖链ConditionalOnMissingBean容器里没有某 Bean 才装配自动配置常用ConditionalOnProperty根据配置文件值决定装配功能开关2-1、最常用ConditionalOnProperty做配置开关application.yml:my.feature.enabled: true配置类Bean ConditionalOnProperty(namemy.feature.enabled, havingValuetrue) public UserService userService() { return new UserService(); }改成false→ 这个 Bean 自动消失不用改代码只改配置非常优雅2-2、Spring Boot 自动配置为什么强因为用了大量ConditionalSpring Boot 的自动配置 ≈ Import(...) 一堆 ConditionalXxx比如 Redis 自动配置Configuration ConditionalOnClass(RedisConnection.class) // 项目里有 Redis 依赖才生效 class RedisAutoConfiguration { }如果你没引入 Redis 依赖 → 这整个配置类直接跳过。这就是为什么“你引什么依赖就自动开什么功能。”小结Conditional 带条件的 Bean满足才装不满足就跳过Spring Boot 自动配置全靠它三、Conditional 注解添加在哪里Conditional不是随便加的要加在“Spring 解析 Bean 的地方”。Conditional可以加在配置类上Configuration控制整个配置类是否生效Bean方法上控制某个 Bean 是否生效其它地方不要加它不会生效。1)加在配置类上控制一坨 BeanConfiguration Conditional(MyCondition.class) // ✅ 满足条件时这里所有 Bean 才会被注册 public class AppConfig { Bean public UserService userService(){ return new UserService(); } Bean public OrderService orderService(){ return new OrderService(); } }结果如果条件成立 →UserService和OrderService都进入容器如果条件不成立 →这个配置类整个不生效适用于开关整个功能模块2)加在Bean方法上控制单个 BeanConfiguration public class AppConfig { Bean Conditional(MyCondition.class) // ✅ 只有满足条件才创建这个 Bean public UserService userService(){ return new UserService(); } }结果满足条件 →userService注册不满足 → 不注册也就不能Autowired适用于只控制某个特定 Bean 是否装配总结Conditional 要么加在配置类 Configuration上要么加在Bean 方法上。控制模块级 → 配置类上控制单个 bean → 方法上四、举例讲解ConditionalOnBean、ConditionalOnMissingBean4-1、它们俩的本质区别注解含义什么时候装配ConditionalOnBean当容器中已经有某个 Bean 时才装配依赖存在时才生效ConditionalOnMissingBean当容器中没有某个 Bean 时才装配避免重复Bean / 提供默认实现你可以理解为ConditionalOnBean 有就装 ConditionalOnMissingBean 没有才装4-2.ConditionalOnBean示例“有依赖才启用”假设只有你项目里已经有 UserService才允许使用 OrderServiceConfiguration public class AppConfig { Bean public UserService userService() { return new UserService(); } Bean ConditionalOnBean(UserService.class) // ✅ 如果容器里存在 UserService 才创建 public OrderService orderService() { return new OrderService(); } }结果是否存在 UserServiceOrderService 是否会注册存在 ✅✅ 会装配不存在 ❌❌ 不装配适用场景比如一个功能必须依赖另一个模块才能开启。4-3.ConditionalOnMissingBean示例“没有才给你默认实现”Spring Boot 在自动配置里用得特别多。比如给你一个默认的UserService但如果你自己已经写了就不用它的Configuration public class AppConfig { // ✅ 默认 UserService Bean ConditionalOnMissingBean(UserService.class) public UserService defaultUserService(){ return new UserService(默认实现); } }用户自己写了一个Service public class UserService { public UserService() { System.out.println(这是我自己的实现); } }结果Spring Boot 发现你自己已经实现了UserService它自动跳过默认的那一个是否存在用户自定义 UserService默认实现是否会装配存在 ✅❌ 跳过默认实现不存在 ❌✅ 使用默认实现4-4、为什么 Spring Boot 自动配置很聪明因为它常常写Bean ConditionalOnMissingBean public Xxx defaultXxx(){ ... }你不写就给你默认的你一旦写了直接用你的这就解释了大家常说的Spring Boot 自动配置 → 约定优于配置自动装配是机制约定优于配置是设计思想。它们合在一起解决的是重复写样板配置的问题。约定就是框架先帮你把默认答案填好约定的本质是框架预设了一套最常用的默认行为。场景约定默认值你的选择你引入了spring-boot-starter-web约定你要用 Tomcat端口 8080不需要写任何配置就能启动你引入了mysql-connector-java约定你要连 MySQL只需要填 url/username/password你引入了spring-boot-starter-data-redis约定 Redis 在 localhost:6379不改配置就能连本地 Redis静态资源放哪约定放在classpath:/static/直接丢文件进去不用配路径优于配置的意思是约定好的默认值优先级高于你手动写的配置。只有当默认值不符合你的需求时你才需要去覆盖它。Spring Boot 用了一系列Conditional注解来实现约定判断Table注解含义约定的体现ConditionalOnClassclasspath 里有某个类才生效你引入了某个依赖我就认为你要用某个功能ConditionalOnMissingBean容器里没有这个 Bean 才生效你自己配了我就不插手ConditionalOnProperty某个配置属性存在才生效你显式开启了这个功能ConditionalOnWebApplication是 Web 应用才生效你引入了 web starter我就按 Web 应用来配这就是约定的技术实现框架通过检查你的环境classpath、配置、Bean 是否存在来猜测你需要什么然后自动配置。一句话Spring Boot 的自动装配就是框架根据你引入了什么依赖这个约定自动帮你把最可能需要的配置做完让你尽量少写甚至不写配置代码。总结ConditionalOnBean → 有它才配我 ConditionalOnMissingBean → 你没写我来补前者做依赖判断依赖存在才装配后者做默认兜底避免 Bean 冲突

相关新闻

SpringBoot18-集成Redis

SpringBoot18-集成Redis

一、SpringBoot集成Redis1-1、先理解:什么是 Redis?Redis 就是一个超快的数据库,但它专门存 数据在内存里(不是硬盘)。你可以把它想象成:一个超级快的“笔记本”,用来暂时记一些数据。 比如&…

2026/10/18 9:24:18 阅读更多 →
《手把手教你写一个生产级 K8s Operator:CRD + Controller + Webhook 全链路实践》

《手把手教你写一个生产级 K8s Operator:CRD + Controller + Webhook 全链路实践》

K8s Operator 控制器 进行深度全链路实践,增加以下生产级特性:并发协调控制(MaxConcurrentReconciles)事件记录(Event Recorder)最终一致性保证(Requeue 策略优化)子资源冲突处理&am…

2026/10/17 20:39:28 阅读更多 →
软路由玩家必看:在PVE7.3上实现iKuai+OpenWRT双路由+NAS+Win10的5个性能优化技巧

软路由玩家必看:在PVE7.3上实现iKuai+OpenWRT双路由+NAS+Win10的5个性能优化技巧

软路由性能调优实战:从J4125到PVE,榨干每一分硬件潜力的进阶指南 如果你已经成功在J4125小主机上部署了PVE,并搭建了iKuai主路由、OpenWRT旁路由、NAS乃至Windows 10的All-in-One系统,那么恭喜你,已经迈入了高阶玩家的行列。但搭建成功只是第一步,真正的挑战在于如何让这…

2026/10/18 9:24:50 阅读更多 →

最新新闻

YOLOv11轨道缺陷检测实战:从数据标注到PySide6桌面应用部署

YOLOv11轨道缺陷检测实战:从数据标注到PySide6桌面应用部署

这阵子一直在搞一套铁路轨道缺陷识别的检测系统,从最初只想把YOLOv11模型跑通,到最后做成一个带登录注册、图片/视频/实时检测、结果导出界面的完整桌面工具,前后折腾了差不多两个月。中间踩了不少坑,也攒下不少可以直接照抄的经验…

2026/10/19 19:08:58 阅读更多 →
3D视觉Infra核心痛点与落地实践:从数据采集到线上监控

3D视觉Infra核心痛点与落地实践:从数据采集到线上监控

我是在一个自动化设备项目里,第一次被“3D视觉Infra”这个词击中。当时团队里算法、工程、产品各干各的,模型训练出来效果也不差,可一到现场测试就翻车。后来排查发现,问题根本不在模型,而在于数据采集时的标定乱了、标…

2026/10/19 19:05:55 阅读更多 →
(论文速读)Sonata:摆脱几何捷径,学习可靠的点云自监督表征

(论文速读)Sonata:摆脱几何捷径,学习可靠的点云自监督表征

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 19:05:55 阅读更多 →
Node-RED队列节流实战:用queue-gate解决消息丢包、乱序与雪崩

Node-RED队列节流实战:用queue-gate解决消息丢包、乱序与雪崩

简介:这是一份面向Node-RED开发者与IoT系统集成工程师的实用扩展节点资源,用于精细化控制消息流并实现带缓冲能力的逻辑门控。该节点弥补了标准gate节点缺乏队列管理的短板,支持open/closed/queueing三种状态切换,可按序释放、预览…

2026/10/19 19:05:55 阅读更多 →
Java连接MySQL与数据交互:从JDBC到连接池的完整实战指南

Java连接MySQL与数据交互:从JDBC到连接池的完整实战指南

用 Java 连接 MySQL 数据库,看起来是个老掉牙的话题,但真正自己动手写过一遍的人都知道,这里面的坑比想象中多得多。尤其是刚接触 Java 后端的朋友,第一次调通 JDBC 代码,心情往往不是“终于学会了”,而是“…

2026/10/19 19:04:53 阅读更多 →
元宝    LeetCode 675. Cut Off Trees for Golf Event Python3 Implement

元宝 LeetCode 675. Cut Off Trees for Golf Event Python3 Implement

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 19:04:53 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →