Spring 进阶技巧:使用 ConditionalOnMissingBean 进行优雅的 Bean 管理

ConditionalOnMissingBean 是 Spring Framework 提供的一个条件注解之一,它的作用是在容器中不存在指定类型的 Bean 时,才会实例化被注解的 Bean。这个注解通常用于配置类或者组件类上,可以根据条件来动态地决定是否创建某个 Bean。

使用 ConditionalOnMissingBean 注解可以实现以下功能:

  1. 避免覆盖已有的 Bean 定义:假设某个接口有多个实现类,通过使用 ConditionalOnMissingBean 注解,可以让某个实现类在没有其他同类型 Bean 的情况下才被注册到容器中,避免了覆盖问题。

  2. 提供默认 Bean 实现:可以在某个接口或者类的实现上使用 ConditionalOnMissingBean 注解,以提供一个默认的实现,但如果用户自定义了该类型的 Bean,则使用用户自定义的 Bean。

下面是一个简单的示例,演示了如何在 Spring Boot 应用中使用 ConditionalOnMissingBean 注解:

@Configuration
public class MyConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService() {return new DefaultMyService();}@Beanpublic AnotherService anotherService() {return new AnotherService();}
}

在上面的示例中,MyConfiguration 类中定义了两个 Bean,分别是 myService 和 anotherService。使用 @ConditionalOnMissingBean 注解修饰的 myService 方法,在容器中不存在 MyService 类型的 Bean 时才会被实例化,否则不会实例化。而 anotherService 方法则不受影响,始终会被实例化。

通过使用 ConditionalOnMissingBean 注解,可以更加灵活地管理 Bean 的创建,根据需要动态地选择是否创建某个 Bean,避免了不必要的重复实例化和覆盖。

@Configuration //表示这个类为配置类
@EnableConfigurationProperties({WebLogProperties.class})
@ConditionalOnProperty(prefix = "zzcloud.weblog",value = "enabled",matchIfMissing = true)
public class WebLogAutoConfig {@Bean@ConditionalOnMissingBeanpublic WebLogAspect webLogAspect(){return new WebLogAspect();}  

为什么这么写

这段代码展示了一个 Spring Boot 自动配置类的典型写法。让我们逐一解析每个注解和方法,并解释为什么这样写:

  1. @Configuration:

    @Configuration
    

    这个注解表示 WebLogAutoConfig 是一个配置类。Spring 会自动扫描并注册该类为 Spring 容器中的配置类,允许在其中定义 Bean。

  2. @EnableConfigurationProperties:

    @EnableConfigurationProperties({WebLogProperties.class})
    

    这个注解启用了 WebLogProperties 类的属性配置绑定功能。它会将配置文件(如 application.propertiesapplication.yml)中以 zzcloud.weblog 为前缀的属性映射到 WebLogProperties 类的字段上。

  3. @ConditionalOnProperty:

    @ConditionalOnProperty(prefix = "zzcloud.weblog", value = "enabled", matchIfMissing = true)
    

    这个注解用于根据外部配置属性条件来决定是否初始化当前配置类中的 Bean。如果配置文件中存在 zzcloud.weblog.enabled=true 的配置,或者没有该配置但 matchIfMissing 设置为 true,则满足条件,执行配置类中的 Bean 定义;否则不执行。

  4. @Bean 和 @ConditionalOnMissingBean:

    @Bean
    @ConditionalOnMissingBean
    public WebLogAspect webLogAspect(){return new WebLogAspect();
    }
    

    这段代码定义了一个名为 webLogAspect 的 Bean。@ConditionalOnMissingBean 注解表示只有在容器中不存在类型为 WebLogAspect 的 Bean 时,才会创建这个 Bean。这种做法可以防止覆盖用户自定义的 WebLogAspect 实现。

为什么这么写?

  1. 灵活的配置管理:

    • 使用 @EnableConfigurationProperties 可以更方便地管理和注入与配置相关的属性,增强了配置的灵活性和可维护性。
  2. 基于条件的自动配置:

    • @ConditionalOnProperty 允许根据配置文件中的特定属性值来控制配置类的激活。这样可以通过简单的配置开关来启用或禁用日志功能,而无需修改代码。
  3. 避免 Bean 冲突:

    • @ConditionalOnMissingBean 确保了默认的 WebLogAspect Bean 只有在用户没有自定义同类型 Bean 时才会被创建。这种机制提供了一种安全、可扩展的方式,允许开发者提供默认实现,但也支持用户自定义实现,避免因为重复定义导致的 Bean 覆盖问题。

总结

这种写法结合了 Spring Boot 的自动配置机制,确保在满足特定条件时才初始化 Bean,同时又保留了用户自定义实现的灵活性。这种方式大大简化了配置过程,提升了应用的可配置性和扩展性。

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

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

相关文章

Python第二语言(十四、高阶基础)

目录 1. 闭包 1.1 使用闭包注意事项 1.2 小结 2. 装饰器:实际上也是一种闭包; 2.1 装饰器的写法(闭包写法) :基础写法,只是解释装饰器是怎么写的; 2.2 装饰器的语法糖写法:函数…

半导体笔记汇总

半导体笔记汇总 介于导体与绝缘体之间的材质就叫做半导体。半导体器件主要分三类:二极管、三极管、MOS管。 一、半导体理论基础 1、导体、半导体和绝缘体 我们根据物质的导电性能强弱将物质分为导体、半导体和绝缘体。电导率与电阻率互为倒数,下图中…

3d模型文件格式有那些,什么区别?---模大狮模型网

3D模型文件格式有很多种,每种格式都有其特点和应用场景。常见的3D模型文件格式包括OBJ、FBX、STL、3DS、DAE等,下面将逐一介绍这些格式的区别。 1. OBJ格式:OBJ是一种开放的3D模型文件格式,可以被几乎所有的3D软件所支持。OBJ格式…

小程序 UI 风格,构建美妙视觉

小程序 UI 风格,构建美妙视觉

系统集成知识科普:核心原理与关键技术

目录 1.系统集成的核心原理 1.1 模块化原理 1.1.1 定义: 1.1.2 优势: 1.1.3 实现方式: 1.2 标准化原理 1.2.1 定义: 1.2.2 作用: 1.2.3 实践案例: 1.2.4 制定与遵循: 1.3 协同性原理…

【DIY飞控板PX4移植】BARO模块BMP388气压计的PCB硬件设计和PX4驱动配置

BARO模块BMP388气压计的PCB硬件设计和PX4驱动配置 BMP388简介硬件设计封装原理图PCB设计引脚选择问题 PX4驱动配置飞控板的配置文件夹结构default.px4board文件nuttx-config/nsh/defconfig文件nuttx-config/include/board.h文件src/board_config.h文件src/i2c.cpp文件init/rc.b…

安卓/iOS/Linux系统影音边下边播P2P传输解决方案

在当今的数字时代,IPTV 影音行业正经历着快速的发展和变革,但影音行业的流量带宽成本一直很高,有没有什么办法既能保证现有的用户观看体验,又能很好降低流量带宽成本呢? P2P技术可能是一个很好的选择,它不仅仅可以提…

Vue2+Element-ui后台系统常用js方法

el-dialog弹框关闭清空form表单并清空验证 cancelDialog(diaLog, formRef) {this[diaLog] falseif (formRef) {this.$refs[formRef].resetFields()} }页面使用&#xff1a; <el-dialog :visible.sync"addSubsidyDialog.dialog" close"cancelDialog(addSub…

大模型赛道有前景吗?普通人该如何入门大模型?(附AI大模型资源)

大模型赛道有前景吗&#xff1f; 这个问题&#xff0c;是个热门话题&#xff0c;但不是个好问题。 因为&#xff0c;它基于不同的提问人、提问意图&#xff0c;会有不同的答案。 对于一个职业发展初期的新人&#xff0c;提问的意图可能是&#xff1a;我要不要转行去大模型赛…

如何实现一个合格的分布式锁

1、概述 在多线程的环境下&#xff0c;为了保证一个代码块在同一时间只能由一个线程访问&#xff0c;Java中我们一般可以使用 synchronized 语法和 ReentrantLock 去保证&#xff0c;这实际上是本地锁的方式。而在如今分布式架构的热潮下&#xff0c;如何保证不同节点的线程同…

聚道云软件连接器:企业数字化转型新动力

在当今数字化浪潮中&#xff0c;企业如何高效整合内部资源、优化业务流程、提升客户满意度&#xff0c;已成为每个企业亟需解决的问题。该公司作为行业内的佼佼者&#xff0c;近期借助聚道云软件连接器成功实现了飞鱼CRM与金蝶云星辰的对接&#xff0c;开启了数字化转型的新篇章…

开源项目推荐:探索吴恩达的Translation Agent

开源项目推荐&#xff1a;探索吴恩达的Translation Agent 引言 随着技术的飞速发展&#xff0c;开源项目已成为推动创新和知识共享的重要力量。在众多开源项目中&#xff0c;吴恩达教授的Translation Agent项目以其独特的创新性和实用性&#xff0c;吸引了全球开发者的目光。…

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度

本文转载自 官方新闻&#xff1a;https://www.apple.com.cn/newsroom/2024/06/macos-sequoia-takes-productivity-and-intelligence-on-mac-to-new-heights/ 文章目录 1、借助 iPhone 镜像 直接在 Mac 上无线使用 iPhone2、Safari 浏览器迎来重大更新3、升级的游戏体验与备受瞩…

资源分享—2021版乡级制图规范符号库

汇总整理超图平台软件相关的各类资源&#xff08;包括但不限于符号库、地图模板、地理处理模型等&#xff09;&#xff0c;助力项目的高效制图、提高数据生产效率等业务。 本次分享新版国土空间规划【2021版乡级制图规范符号库】&#xff0c;提供SuperMap格式符号库下载。 符…

Python学习笔记8:入门知识(八)

前言 本篇是元组的知识点学习以及知识点的补充 元组 概念 不可变的列表&#xff0c;叫做元组。 在之前列表的特性中&#xff0c;我们就说过列表是可变的&#xff0c;但是在实际使用过程中&#xff0c;我们有时候仍然需要一系列不可变的元素&#xff0c;这个时候就需要元组出…

代码解读 | Hybrid Transformers for Music Source Separation[06]

一、背景 0、Hybrid Transformer 论文解读 1、代码复现|Demucs Music Source Separation_demucs架构原理-CSDN博客 2、Hybrid Transformer 各个模块对应的代码具体在工程的哪个地方 3、Hybrid Transformer 各个模块的底层到底是个啥&#xff08;初步感受&#xff09;&#xff1…

八爪鱼现金流-022-mybatis插件加密和国密SM4算法

背景&#xff1a; 用户的金额数据&#xff0c;不希望被别人看到。 业务场景分析&#xff1a; 用户在页面上添加金额数据 -----> 服务器内存&#xff08;加密、解密&#xff09; -----> 存储数据库 调研及结果&#xff1a; 使用mybatis的拦截器插件&#xff0c;进行数…

win11电脑桌面倒计时提醒怎么设置?

在日常工作中&#xff0c;我们经常需要处理大量的工作任务&#xff0c;而且很多任务都有时间限制。如果将这些任务记录在桌面上&#xff0c;并设置倒计时提醒&#xff0c;无疑会大大提高我们的工作效率。想象一下&#xff0c;在繁忙的工作间隙&#xff0c;你只需一瞥桌面&#…

文件简单做二维码的方法,几步就能够完成操作

怎样用二维码来查看文件内容&#xff1f;随着网络的快速发展&#xff0c;通过二维码来查看文件是现在很常用的一种形式&#xff0c;能够更快让其他人获取文件内容&#xff0c;从而提升传播的速度和效率。比如用这种方式来下发通知文件、分享学习资料、浏览海报图片、传递个人简…

ESP32基础应用之esp32连接腾讯云并使用微信小程序控制的智能灯

文章目录 1. 项目简介1.1 功能接收1.2 使用资源1.3 测试平台 2 腾讯云物联网开发平台3 esp32设备开发3.1 准备参考例程3.2 vscode平台创建测试工程3.3 修改工程 问题总结使用PowerShell命令行终端生成的二维码不能用 1. 项目简介 1.1 功能接收 实现腾讯云创建项目与设备&…