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/7/23 19:39:11 阅读更多 →
《手把手教你写一个生产级 K8s Operator:CRD + Controller + Webhook 全链路实践》

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

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

2026/7/23 19:39:11 阅读更多 →
软路由玩家必看:在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/7/23 19:39:11 阅读更多 →

最新新闻

【C++字符串】char*、const char*、char[]和std::string

【C++字符串】char*、const char*、char[]和std::string

专栏网址:https://blog.csdn.net/zhujushu/category_13112687.html 0.概述 在程序开发中,字符串操作是必不可少的功能之一。在众多编程语言中,C对字符串有着底层、较良好的支持。 C 提供了以下两种字符串表示形式: C语言风格 …

2026/7/23 19:53:20 阅读更多 →
武汉老板注意:光谷企业做展厅,别再拿“科技感“说事了

武汉老板注意:光谷企业做展厅,别再拿“科技感“说事了

‍武汉光谷,"中国光谷"这块招牌挂了快 40 年。2025 年的光谷,聚集了 1.6 万家高新技术企业、6 家国家实验室、3 个国家大科学装置。这些企业几乎家家都想做展厅,但 80% 的光谷展厅,第一句话是"科技感"。科技感…

2026/7/23 19:53:20 阅读更多 →
地信本科,应该学什么编程语言?什么阶段学?

地信本科,应该学什么编程语言?什么阶段学?

首先,一般地信本科的课程设置里就包含C、C这几种底层开发语言,但是通常不教C# ,因为C#是专门的GIS桌面开发课程,比如使用ArcEngine进行桌面端的开发。主流的GIS开发编程更倾向WebGIS或Python。C语言C语言是计算机的底层语言&#…

2026/7/23 19:53:20 阅读更多 →
惠普锐 Pro 16 全能轻薄本科普

惠普锐 Pro 16 全能轻薄本科普

惠普锐 Pro 16 是面向学生、职场创作者的 16 英寸大屏全能本,搭载标压锐龙 7 H255,标配 24GB 大内存 1TB 固态,叠加国家补贴与平台优惠后到手仅 5403.5 元,兼顾性能、大屏与高性价比,下面分四大维度解析。 一、锐龙标…

2026/7/23 19:53:20 阅读更多 →
Kimi K3大模型实测:两天半让《赤色要塞》在UEFI Shell下完美复现,

Kimi K3大模型实测:两天半让《赤色要塞》在UEFI Shell下完美复现,

Kimi K3 刚发布,据说是目前最好的开源大模型,我也来挑战一下让它编写 BIOS 程序,同时为了和 DeepSeek V4 Pro 比较,我也让 Kimi K3 直接对着红白机《赤色要塞》的 6502 反汇编逐行翻译,在 UEFI Shell 下原生运行。两天…

2026/7/23 19:53:20 阅读更多 →
30个摄像头基本知识点,弱电工程师必知

30个摄像头基本知识点,弱电工程师必知

在弱电工程领域,视频监控系统是核心组成部分之一,摄像头(监控摄像机)作为前端采集设备,直接关系到整个系统的稳定性和可靠性。作为弱电工程师,必须熟练掌握摄像头的安装、调试、维护和故障排查知识。本文系统梳理了30个摄像头基本知识点,涵盖选型、安装、联网、存储、控…

2026/7/23 19:52:19 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻