当前位置: 首页 > news >正文

【Spring】条件装配 @ConditionalOnClass @ConditionalOnBean

   @ConditionalOnClass 是 Spring Framework 提供的一个注解,用于在应用程序上下文加载过程中根据类的存在与否来决定是否创建或配置某个 bean。

        通常情况下,当应用程序上下文加载时,Spring 会根据配置文件或注解等方式定义的 bean 定义来创建对象,并将其加入到 bean 集合中。然而,有时候我们希望只在某些特定的类存在时才创建或配置某个 bean。这时候,就可以使用 @ConditionalOnClass 注解。

   @ConditionalOnClass 注解可以用于类或接口上,它的作用是检查指定类或接口是否存在于应用程序上下文中。如果存在,则进行相应的 bean 创建或配置;如果不存在,则忽略该 bean 的创建或配置。

下面是一个示例:

@Configuration  
@ConditionalOnClass(value = {A.class})  
public class MyConfiguration {  @Bean  public B b() {  return new B();  }  
}

        在这个示例中,MyConfiguration 类上使用了 @ConditionalOnClass 注解,并指定了需要检查的类 A。如果这个类都存在于应用程序上下文中,那么 MyConfiguration 类中的 b 方法将会被调用,并返回一个 B 对象。否则,这个 bean 将不会被创建或配置。

        需要注意的是,@ConditionalOnClass 注解只能检查类或接口是否存在于应用程序上下文中,而不能检查类的实例是否已经存在。如果需要检查类的实例是否存在,可以使用 @ConditionalOnBean 注解。

下面是一个示例:

@Configuration  
@ConditionalOnBean(value = A.class)  
public class MyConfiguration {  @Bean  public B b() {  return new B();  }  
}

        在这个示例中,MyConfiguration 类上使用了 @ConditionalOnBean 注解,并指定了需要检查的类 MyBean。如果 A 的实例存在于应用程序上下文中,那么 MyConfiguration 类中的 b 方法将会被调用,并返回一个 B 对象。否则,这个 bean 将不会被创建或配置。

       在Spring中,有许多与条件装配相关的注解。这些注解可以帮助我们更方便地实现条件装配。以下是一些常用的条件装配注解:

  1. @Conditional 这是一个通用的条件装配注解,可以用于任何情况下的条件装配。它需要指定一个实现了Condition接口的类,用于判断是否满足条件。

  2. @ConditionalOnBean 当容器中存在某个指定的bean时,才会创建被注解的bean。

  3. @ConditionalOnMissingBean 当容器中不存在某个指定的bean时,才会创建被注解的bean。

  4. @ConditionalOnClass 当类路径下存在某个指定的类时,才会创建被注解的bean。

  5. @ConditionalOnMissingClass 当类路径下不存在某个指定的类时,才会创建被注解的bean。

  6. @ConditionalOnProperty 当指定的属性存在且值为指定值时,才会创建被注解的bean。

  7. @ConditionalOnResource 当指定的资源存在时,才会创建被注解的bean。

  8. @ConditionalOnWebApplication 当应用程序是一个Web应用程序时,才会创建被注解的bean。

  9. @ConditionalOnNotWebApplication 当应用程序不是一个Web应用程序时,才会创建被注解的bean。

  10. @ConditionalOnExpression  当指定的SpEL表达式计算结果为true时才进行装配。

这些注解都是基于@Conditional注解实现的,可以方便地进行条件装配。使用这些注解可以使得代码更加简洁、易于维护。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Midjourney中文版】智能绘画,高效便捷
  • python日志搜集分析系统
  • 系统架构笔记-3-信息系统基础知识
  • 关于 NLP 应用方向与深度训练的核心流程
  • 鸿蒙环境服务端签名直传文件到OSS
  • Redis安全
  • Elasticsearch7.7.1集群不能相互发现的问题解决以及Elasticsearch7.7.1安装analysis-ik中文分词插件的应用
  • 力扣19 删除链表的倒数第N个节点 Java版本
  • 【C++】模拟实现list
  • Why Is Prompt Tuning for Vision-Language Models Robust to Noisy Labels?
  • Android String资源文件中,空格、换行以及特殊字符如何表示
  • 网络爬虫进阶
  • LlamaIndex 的Node节点后处理器模块介绍
  • 二叉树中序遍历非递归+递归C++实现
  • linux之网络命令
  • ECMAScript6(0):ES6简明参考手册
  • Java超时控制的实现
  • Java到底能干嘛?
  • JS+CSS实现数字滚动
  • mysql 5.6 原生Online DDL解析
  • nodejs实现webservice问题总结
  • Spring-boot 启动时碰到的错误
  • ViewService——一种保证客户端与服务端同步的方法
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前嗅ForeSpider中数据浏览界面介绍
  • 人脸识别最新开发经验demo
  • 软件开发学习的5大技巧,你知道吗?
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • gunicorn工作原理
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​Spring Boot 分片上传文件
  • #### golang中【堆】的使用及底层 ####
  • #define 用法
  • $.proxy和$.extend
  • (30)数组元素和与数字和的绝对差
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (vue)页面文件上传获取:action地址
  • (不用互三)AI绘画工具应该如何选择
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET MVC 验证码
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET构架之我见
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400