【spring】@Conditional注解学习

@Conditional介绍

@Conditional注解用于按照设定的条件进行判断,从而决定是否将某个bean注册到Spring容器中。

@Conditional注解是在Spring 4.0版本中引入的,它提供了一种更加灵活的方式来控制bean的创建和注册。在此之前,开发者通常使用@Profile注解来根据不同的环境配置来加载不同的bean,但@Profile的使用范围相对有限,仅适用于基于环境变量的条件检查。而@Conditional注解则更加通用,允许开发者自定义条件检查策略,从而实现更复杂的条件逻辑。

这个注解可以用于类级别,也可以用于方法级别。

要使用@Conditional注解,你需要创建一个实现了Condition接口的类,并重写matches方法来定义你的条件判断逻辑。当matches方法返回true时,对应的bean将会被注册到Spring容器中;如果返回false,则不会注册。这种机制使得你可以根据应用的配置、环境变量或其他任何条件来决定是否创建某个bean实例。

@Conditional 注解可以与以下条件类一起使用

  • OnClassCondition:检查类路径中是否存在指定的类。

  • OnMissingClassCondition:检查类路径中是否不存在指定的类。

  • OnBeanCondition:检查Spring容器中是否存在指定的Bean。

  • OnMissingBeanCondition:检查Spring容器中是否不存在指定的Bean。

  • OnPropertyCondition:检查系统属性或环境变量是否满足指定的条件。

  • OnResourceCondition:检查类路径中是否存在指定的资源。

  • OnWebApplicationCondition:检查是否是Web应用程序环境。

@Conditional源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {Class<? extends Condition>[] value();
}
源代码截图

@Conditional 属性介绍

  • value:指定Condition接口的实现类,Condition接口的实现类中需要编写具体代码实现向Spring中注入Bean的条件

@Conditional 注解使用场景

@Conditional注解的使用场景主要体现在以下几个方面:

  • 基于属性配置的条件注入:使用@ConditionalOnProperty可以根据指定的属性是否存在或是否具有特定的值来决定是否创建和注册Bean。这在需要根据配置文件动态决定是否启用某个功能时非常有用。
  • 基于Bean存在的条件注入@ConditionalOnBean注解可以用来检查Spring上下文中是否已经存在某个Bean,如果存在,则创建和注册新的Bean。这在需要某个Bean作为依赖时尤其有用。
  • 基于类存在的条件注入@ConditionalOnClass注解用于检查某个类是否在类路径中可用,如果可用,则进行Bean的创建和注册。这在自动配置和模块加载时非常有用。
  • 基于资源存在的条件注入@ConditionalOnResource注解允许你根据特定资源的存在与否来决定是否创建和注册Bean。这在需要外部资源(如文件、URL等)时很有帮助。
  • 基于Web环境的条件注入@ConditionalOnWebApplication注解用于确保只有在Web环境中才会创建和注册Bean,这对于Web特定功能的自动配置非常有用。
  • 基于SpEL表达式的条件注入@ConditionalOnExpression注解允许你使用Spring Expression Language (SpEL) 来定义复杂的条件表达式,从而控制Bean的创建和注册。
  • 自定义条件实现:你可以自定义实现Condition接口的类,通过实现matches方法来定义自己的条件逻辑。这种方式提供了最大的灵活性,允许你根据任何复杂的条件来决定Bean的创建

@Conditional测试示例代码

示例代码 一
ConditionalDemo类
package com.yang.SpringTest.annotation.conditionalLearn;import lombok.Data;/*** <p>description</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.conditionalLearn* Ceate Time 2024-03-20 14:55*/
@Data
public class ConditionalDemo {
}
ConditionalDemoCondition类
package com.yang.SpringTest.annotation.conditionalLearn;import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;/*** <p>description</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.conditionalLearn* Ceate Time 2024-03-20 14:52*/public class ConditionalDemoCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {String osName = context.getEnvironment().getProperty("sun.desktop");return osName.contains("windows") ? true : false;}
}
ConditionalDemoConfig配置类
package com.yang.SpringTest.annotation.conditionalLearn;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;/*** <p>配置类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.conditionalLearn* Ceate Time 2024-03-20 14:54*/
@Slf4j
@Configuration
@Conditional(ConditionalDemoCondition.class)
public class ConditionalDemoConfig {@Beanpublic ConditionalDemo demo() {log.info("------------- ConditionalDemo init -------------");return new ConditionalDemo();}
}
ConditionalTest测试类
package com.yang.SpringTest.annotation.conditionalLearn;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Arrays;/*** <p>测试类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.conditionalLearn* Ceate Time 2024-03-20 14:58*/public class ConditionalTest{public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionalDemoConfig.class);String[] definitionNames = context.getBeanDefinitionNames();Arrays.stream(definitionNames).forEach((definitionName) -> System.out.println(definitionName));}
}
运行结果




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

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

相关文章

Automated and Cooperative Vehicle Merging at Highway On-Ramps

论文解读——Automated and Cooperative Vehicle Merging at Highway On-Ramps 参考资料来源&#xff1a;《Automated and Cooperative Vehicle Merging at Highway On-Ramps》一文 1.问题描述 该文章想解决如FIG.1中的匝道合流问题&#xff0c;传统的匝道合理需要等待main r…

vue@2.7.16 使用less、less-loader

遇到问题&#xff0c;npm install less-loader7.3.0 --save安装好less-loader后&#xff0c;执行npm run serve 项目运行不起来&#xff0c;排查后发现在安装less-loader后就提示需要安装less&#xff0c;正确的安装应如下&#xff1a; npm install less less-loader7.3.0 --sa…

物联网应用技术中的stm32该怎么学,该从哪入手?

物联网应用技术中的stm32该怎么学&#xff0c;该从哪入手&#xff1f; STM32是只物联网中的一部分&#xff0c;单纯的学个STM32是没法满足物联网开发需求的&#xff0c;实际产品开发过程中会考虑成本等多种因素选择合适的方案&#xff0c;比如使用单片机还是stm32或是更高端的芯…

前端vue实现甘特图

1 什么是甘特图 甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。以提出者亨利L甘特先生的名字命名&#xff0c;是项目管理、生产排程、节点管理中非常常见的一个功能。 甘特图内在思想简单&#xff0c;即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的…

考研数学|《660》题这样刷,效率最高!

首先要了解一下660的难度&#xff0c;我认为660的难度是在基础和强化之间的一本习题册。具有一些比较好的选填题目&#xff0c;有些题目可能对初学者来说较为困难&#xff0c;尤其是一些包含二级结论的一些题目。但是对于强化阶段来说&#xff0c;这本题目可能难度较低了一些。…

基于springboot+vue的游戏交易系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

C语言学习 三、运算符与表达式

3.1 运算符分类 c语言提供了13种类型的运算符&#xff0c;如下所示&#xff1a; &#xff08;1&#xff09;算术运算符&#xff08; - * / %&#xff09; &#xff08;2&#xff09;关系运算符&#xff08;> < > < !&#xff09; &#xff08;3&#xff09;逻…

【职位管理】某大型能源化工企业职位管理体系搭建咨询项目

随着企业的发展&#xff0c;企业内部员工的数量不断增加。而管理职位的有限性使得员工的晋升出现“过独木桥”的现象&#xff0c;有些企业为了缓解这种问题&#xff0c;采取增设副职与助理岗位的办法&#xff0c;却导致组织机构迅速膨胀。那么&#xff0c;华恒智信专家是如何解…

在基于全志V851se的TinyVision上手动构建 Linux 6.1 + Debian 12 镜像

构建 SyterKit 作为 Bootloader SyterKit 是一个纯裸机框架&#xff0c;用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的开发板&#xff0c;SyterKit 使用 CMake 作为构建系统构建&#xff0c;支持多种应用与多种外设驱动。同时 SyterKit 也具有启动引导的功能&a…

mysql数据类型和常用函数

目录 1.整型 1.1参数signed和unsigned 1.2参数zerofill 1.3参数auto_increment 2.数字类型 2.1floor()向下取整 2.2随机函数rand() 2.3重复函数repeat() 3.字符串类型 3.1length()查看字节长度&#xff0c;char_length()查看字符长度 3.2字符集 3.2.1查看默认字符…

海外舆情监控的重要性以及云手机的推荐

海外市场不仅有着无尽的商机&#xff0c;同时也存在着各种各样的挑战。例如&#xff0c;海外市场舆情的复杂变化给企业带来了潜在风险&#xff0c;尤其在新媒体技术快速发展的时代&#xff0c;舆论对企业品牌形象的影响日益巨大。本文将详细探讨海外舆情监控的重要性以及为大家…

FlorisBoard:Android开源键盘的现代化选择

FlorisBoard&#xff1a;Android开源键盘的现代化选择 简介 FlorisBoard是一款免费且开源的安卓键盘&#xff0c;适用于Android 7.0及以上版本的设备。它的现代化设计和用户友好的界面使其在众多键盘应用中脱颖而出。FlorisBoard的独特之处在于它注重用户体验的同时&#xff0…

抖音视频提取工具可导出视频分享链接|视频爬虫批量下载

抖音无水印视频批量下载工具操作指南 一、工具介绍 我们开发了一款功能强大的视频批量下载工具&#xff0c;不仅能够通过单个视频链接进行提取&#xff0c;还可以通过关键词进行视频搜索&#xff0c;Q:290615413实现批量提取和有选择性的下载。 二、操作步骤 2.1 关键词批量…

IO网络通信

IO Bio&#xff1a; 同步阻塞&#xff0c;一个线程一次连接&#xff0c;基于字符流/字节流 Nio&#xff1a;同步非阻塞 一个线程多个连接&#xff0c;多个请求注册到多路复用selector上&#xff0c;多路复用器轮训连接 面向缓冲区&#xff0c; 从某通道读取数据到缓存区&…

Android:adb命令

执行adb命令的窗口如下 Mac或Linux系统里的终端窗口&#xff1b; window系统运行输入cmd打开的指令窗口&#xff1b; Android Studio 里控制下面的Terminal窗口 1. 查看已链接的设备和模拟器 adb devices -l 2. 查看Android内核版本号 adb shell getprop ro.build.version.re…

数据结构和算法:哈希表

哈希表 哈希表&#xff08;hash table&#xff09;&#xff0c;又称散列表&#xff0c;它通过建立键 key 与值 value 之间的映射&#xff0c;实现高效的元素查询。具体而言&#xff0c;向哈希表中输入一个键 key &#xff0c;则可以在 &#x1d442;(1) 时间内获取对应的值 va…

CSS样式表 样式优先级 选择器以及选择器的权重优先级

CSS组成 css由选择符和声明组成&#xff0c;声明又分为属性和属性值 属性必须放在花括号里面&#xff0c;属性与属性值必用冒号连接 每条声明用分号结束 当一个属性有多个属性值的时候&#xff0c;属性值与属性值部分先后顺序&#xff0c;用空格隔开 在书写样式过程中、空格、换…

软文营销塑造品牌形象,迅推客助力企业成功求发展

企业可以选择适合自身的新闻宣传方法。迅推客作为互联网整合营销机构&#xff0c;积极推动软文营销&#xff0c;助力企业塑造高端品牌形象。 1、新闻稿战略规划。 新闻宣传前要有明确的战略规划。在新闻稿的创作过程中&#xff0c;企业的需求与消费者的需求巧妙地融合在一起。…

室内3D模型选择指南:哪家更值得信赖?

如今室内设计的3D模型已经成为了一种重要的设计工具。它们能够帮助设计师们更好地向客户展示他们的设计想法&#xff0c;同时也让客户能够更直观地理解他们的需求。然而&#xff0c;面对市场上众多的室内3D模型网站&#xff0c;我们该如何选择呢? 室内3D模型选择指南&#xff…

echarts系列:echarts增加loading

背景 最近在大屏项目研发时&#xff0c;存在多个echarts图表&#xff0c;有些接口获取数据较慢&#xff0c;需要加loading样式&#xff1b; 解决方案 翻阅api&#xff0c;找到showLoading可进行设置 参考&#xff1a; 加载动画效果 显示加载动画效果。可以在加载数据前手动…