Spring Boot 注解 @ConditionalOnMissingBean是什么

一句话总结:

@ConditionalOnMissingBean 是 Spring Boot 提供的一个 条件注解(Conditional Annotation),意思是:

只有当 Spring 容器中 不存在 某个 Bean 时,当前的 Bean 或配置才会被加载。

这是一种典型的“按需装配”策略,常用于自动配置类(Auto Configuration)中。

如果大家有看源码的习惯,会发现到处都有这个注解:

RestTemplate:

Jackson - ObjectMapper:

  • Spring Boot 默认提供的 JSON 解析工具 ObjectMapper

  • 如果你没自己定义一个,它就帮你创建一个默认的

  • 你可以完全覆盖它,比如配置命名策略、日期格式等

框架或者组件库想要提供一个默认实现,但又允许使用者自定义自己的实现。这个时候就可以使用 @ConditionalOnMissingBean。这就达到了 可扩展+默认兜底 的目的。

同理,还有个相对应的是:@ConditionalOnBean 

对比:@ConditionalOnBean vs @ConditionalOnMissingBean

注解含义
@ConditionalOnBean(SomeClass.class)只有当容器中存在 SomeClass 类型的 Bean 时才执行
@ConditionalOnMissingBean(SomeClass.class)只有当容器中不存在 SomeClass 类型的 Bean 时才执行

这两个注解是互补的,分别用于不同的场景。

支持的用法形式

@ConditionalOnMissingBean(SomeClass.class)                 // 类型判断
@ConditionalOnMissingBean(name = "someBeanName")           // 名称判断
@ConditionalOnMissingBean(value = SomeClass.class)         // 等价于上面的类型判断
@ConditionalOnMissingBean(type = "com.example.SomeClass")  // 用字符串形式避免类加载

你也可以组合使用,如:

@ConditionalOnMissingBean(value = SomeInterface.class,name = "customBean"
)

特别注意:

不能直接加在 @Component、@Service、@Controller 等用于直接注册 Bean 的注解上,因为 Spring 在解析这些注解时并不会走自动配置的判断逻辑,因此不会触发 @ConditionalOnMissingBean 的条件判断,最终会导致Bean 被强制注册或 注册失败报错!

代码示例

自定义一个接口:


public interface MyService {void hello();
}

错误示例

先来一个错误示例(直接在@Component下加上了):


@Slf4j
@Component
@ConditionalOnMissingBean(MyService.class)
public class MyServiceDefault implements MyService {@Overridepublic void hello() {log.info("use default bean...");}
}

 项目不会报错,直接启动后查找Bean:

会发现根本没注册上。所以,虽然加在@Component等注解的类上语法允许,但 Spring 不会进行条件判断和直接注册,可能导致意料之外的报错。所以不要这么用。

正确用法:

@Configuration + @Bean 的方式(大家回头看看我最上面截的源码截图中,也都是这种方式)


@Configuration
public class MyServiceAutoConfiguration {@Bean@ConditionalOnMissingBean(MyService.class)public MyService myService() {return new MyServiceDefault();}
}

默认实现类:


@Slf4j
public class MyServiceDefault implements MyService {@Overridepublic void hello() {log.info("use default bean...");}
}

找个地方调用一下:

public class StarApplication {@Autowiredprivate MyService myService;public static void main(String[] args) {SpringApplication.run(StarApplication.class, args);}@PostConstructpublic void test() {myService.hello();}
}

现在模拟用户实现了这个接口:


@Slf4j
@Component
public class MyServiceUser implements MyService {@Overridepublic void hello() {log.info("use self bean...");}
}

可以看到就一个Bean:

当然,你也可以去掉这个注解试试:

再次运行:

可以看到两个地方都注册上了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyInstaller 如何在mac电脑上生成在window上可执行的exe文件

PyInstaller跨平台打包限制 PyInstaller 无法直接从macOS生成Windows可执行文件,因为它需要访问目标平台的系统库和Python环境来构建可执行文件。要在macOS上为Windows打包Python应用,需要通过以下方法之一: 方法一:使用虚拟机或…

零基础设计模式——创建型模式 - 抽象工厂模式

第二部分:创建型模式 - 抽象工厂模式 (Abstract Factory Pattern) 我们已经学习了单例模式(保证唯一实例)和工厂方法模式(延迟创建到子类)。现在,我们来探讨创建型模式中更为复杂和强大的一个——抽象工厂…

【通用智能体】Serper API 详解:搜索引擎数据获取的核心工具

Serper API 详解:搜索引擎数据获取的核心工具 一、Serper API 的定义与核心功能二、技术架构与核心优势2.1 技术实现原理2.2 对比传统方案的突破性优势 三、典型应用场景与代码示例3.1 SEO 监控系统3.2 竞品广告分析 四、使用成本与配额策略五、开发者注意事项六、替…

Flask-SQLAlchemy核心概念:模型类与数据库表、类属性与表字段、外键与关系映射

前置阅读,关于Flask-SQLAlchemy支持哪些数据库及基本配置,链接:Flask-SQLAlchemy_数据库配置 摘要 本文以一段典型的 SQLAlchemy 代码示例为引入,阐述以下核心概念: 模型类(Model Class) ↔ 数…

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit2

RKNN Toolkit2是用来将onnx模型转成rknn专用模型,并可通过RKNN Toolkit Lite2或者RKNPU调用NPU进行加速计算的工具。 一开始我安装很多次都无法成功安装。后来跟售后技术对接,必须是PC平台的Linux环境才可以。我的电脑是windows,所以我需要用…

基于深度学习的工件检测系统设计与实现

在工业自动化领域,工件检测一直是提高生产效率和产品质量的关键环节。传统的人工检测方法不仅效率低下,而且容易受到主观因素的影响,导致误判率较高。随着深度学习技术的飞速发展,基于图像识别的自动检测系统逐渐成为研究热点。今…

CyberSecAsia专访CertiK首席安全官:区块链行业亟需“安全优先”开发范式

近日,权威网络安全媒体CyberSecAsia发布了对CertiK首席安全官Wang Tielei博士的专访,双方围绕企业在进军区块链领域时所面临的关键安全风险与防御策略展开深入探讨。 Wang博士在采访中指出,跨链桥攻击、智能合约漏洞以及私钥管理不当&#x…

Google C++ Style Guide 谷歌 C++编码风格指南,深入理解华为与谷歌的编程规范——C和C++实践指南

Google C 编程风格指南 Release Apr 07, 2017 0. ᡿享 ⡾ᵢ 4.45 ৕֒㘻 Benjy Weinberger, Craig Silverstein, Gregory Eitzmann, Mark Mentovai, Tashana Landray 㘱䈇 YuleFox, Yang.Y, acgtyrant, lilinsanity 亯ⴤѱ享 • Google Style Guide • Google 开源…

当科技邂逅浪漫:在Codigger的世界里,遇见“爱”

520,一个充满爱意的日子,人们用各种方式表达对彼此的深情。而在科技的世界里,我们也正经历着一场特别的邂逅——Codigger,一个分布式操作系统的诞生,正在以它独特的方式,重新定义我们与技术的关系。 Codigg…

嵌入式学习笔记 - Void类型的指针

void指针的基本概念和特性 void指针是一种特殊的指针类型,称为“无类型指针”或“通用指针”。它的主要特点是: ‌通用性‌:void指针可以指向任何类型的数据,这使得它在处理不确定数据类型时非常有用。 ‌灵活性‌:由…

【综述】视频目标分割VOS

相关连接 更新中....... 1、Associating Objects with Transformers for Video Object Segmentation:论文详解、AOT源码解析 2、Rethinking Space-Time Networks with Improved Memory Coverage for Efficient Video Object Segmentation 3、Recurrent Dynamic Embe…

001 嵌入式软件开发工程师实习篇面试——首战总结

2025年5月17日人生中第一次面试 紧张是藏不住的。但是不应该的。 目录 0.准备一份合适的自我介绍 1.结构体内存对齐问题 2.变量在内存中的存储模式 3.嵌入式中程序框架有哪些 4.程序代码设计要遵循什原则 5.版本号书写 6.单片机最小系统板有哪些组成 必须: 非必须:…

SIL2/PLd 认证 Inxpect毫米波安全雷达:3D 扫描 + 微小运动检测守护工业安全

Inxpect 成立于意大利,专注工业安全技术。自成立起,便致力于借助先进雷达技术提升工业自动化安全标准,解决传统安全设备在复杂环境中的局限,推出获 SIL2/PLd 和 UL 认证的安全雷达产品。 Inxpect 的雷达传感器技术优势明显。相较于…

Python数据可视化再探——Matplotlib模块 之一

目录 第一章 Matplotlib 模块教学内容​——基础图形绘制 一、Pyplot 子库介绍​ 1. 功能概述​ 2. 常用函数​ 二、绘制基本图形​ 1. 柱状图​ 2. 条形图​ 3. 折线图​ 4. 散点图​ 5. 面积图​ 6. 饼状图​ 7. 圆环图​ ​编辑 三、绘图知识点详解​ 1. 绘图…

智慧在线判题OJ系统项目总体,包含功能开发思路,内部中间件,已经部分知识点

目录 回顾一下xml文件怎么写 哪个地方使用了哪个技术 MyBatis-Plus-oj的表结构设计, 管理员登录功能 Swagger Apifox​编辑 BCrypt 日志框架引入(slf4jlogback) nacos Swagger无法被所有微服务获取到修改的原因 身份认证三种方式: JWT(Json Web Json,一…

使用Spring Boot和Spring Security构建安全的RESTful API

使用Spring Boot和Spring Security构建安全的RESTful API 引言 在现代Web应用开发中,安全性是至关重要的。Spring Boot和Spring Security是Java生态中广泛使用的框架,它们提供了强大的工具来保护RESTful API。本文将介绍如何结合Spring Boot和Spring S…

虚幻引擎5-Unreal Engine笔记之`GameMode`、`关卡(Level)` 和 `关卡蓝图(Level Blueprint)`的关系

虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图(Level Blueprint)的关系 code review! 参考笔记: 1.虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图&…

Java+Selenium+快代理实现高效爬虫

目录 一、前言二、Selenium简介三、环境准备四、代码实现4.1 创建WebDriver工厂类4.2 创建爬虫主类4.3 配置代理的注意事项 六、总结与展望 一、前言 在Web爬虫技术中,Selenium作为一款强大的浏览器自动化工具,能够模拟真实用户操作,有效应对…

SpringBoot配置文件的合并

需求:想分类将mysql数据库的配置放在一个文件,redis的配置放在另外一个文件 就不去引入mysql和redis了,看能否得到值就行了 测试结果 model的包放错了 应该移动到demo里 能否用yml或者yaml呢 这里注意yml的写法 测试结果也是可以的 注意如果主配置文件是yml或者yaml的话

深入理解 BFC:网页布局的关键机制

在前端开发的世界里,网页布局是一项至关重要的任务。而在众多布局相关的概念中,BFC(Block Formatting Context,块级格式化上下文)扮演着极为关键的角色。今天,就让我们深入剖析 BFC 的方方面面。 一、BFC …