关于ConditionalOnClass注解
1. pom文件<optional>标签
在Java开发中,大家肯定在pom文件中添加过依赖(现在没有,以后也肯定会有的),不知道大家对<optional>标签的了解有多少,或者是你没看下面内容,都不知道optional单词应该放在什么地方,没关系我会讲,听不懂还可以搜索别的优质博客。
<optional>标签在pom文件中长这样:
<dependency>
<groupId>com.handsometaoa</groupId>
<artifactId>sms-utool</artifactId>
<version>1.0-SNAPSHOT</version>
<optional>true</optional> <!-- 在这里 -->
</dependency>
它的作用是:当其他模块依赖当前模块时,不会传递依赖 optional 标签值为true的依赖文件,可结合下图理解:

B模块依赖C模块,并提供了BHelloUtils类,其中调用了C模块CHelloUtils的cSayHello方法,并注意(加粗)B模块pom文件中C依赖项的optional标签值为true。
现在A模块依赖B模块,当调用BHelloUtils中bSayHello方法,程序会进行报错,提示找不到CHelloUtils,这里就验证了optional的作用。
那我们应该如何调整程序?在A模块pom文件添加C依赖。
2. optional hutool应用实例
空口无凭,Hutool 工具包实现了很多好用的工具,他的扩展工具包就依赖很多了第三方工具包,例如:

2.1 验证
怎么验证?拿emoji举例,没添加emoji-java依赖,EmojiUtil会爆红(找不到依赖项)。

为什么我们使用hutool工具时,没添加emoji-java也没显示错误?由于Java是动态加载,在未使用时不会报错。
2.2 设计原因
Hutool开发者考虑到扩展中的内容我们一般不会用到,假如Hutool pom中为默认或者<optional>false</optional>,当我们引入hutool工具,会相应引入额外的其他依赖(本质上不会使用),也可能会导致依赖冲突(hutool 中依赖版本为1.1.1,自己项目中版本为 1.0.9)。
3. ConditioalOnClass
ConditioalOnClass:就是当前类路径下存在该类,才会使标有该注解的类或方法生效
3.1 测试代码结构总览

sms-unite-sdk中配置类可以这样写,就能实现阿里云、腾讯云短信二选一。
@Configuration
public class SmsConfig {
@Bean
@ConditionalOnClass(name = "com.aliyun.sms.SmsServiceImpl")
public SmsService ailiyunSmsService() {
System.out.println("aliyun smsService init");
return new com.aliyun.sms.SmsServiceImpl();
}
@Bean
@ConditionalOnMissingBean(SmsService.class)
@ConditionalOnClass(name = "com.tencent.sms.SmsServiceImpl")
public SmsService tencentSmsService() {
System.out.println("tx smsService init");
return new com.tencent.sms.SmsServiceImpl();
}
}
4. 关于Spring 自动装配
2.7.x之前:resources 下增加META-INF文件夹,创建spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.handsometaoa.config.SmsConfig
2.7.x之后:resources 下增加META-INF文件夹,在其下创建spring文件夹,最后创建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
com.handsometaoa.config.SmsConfig
为了兼容,可以同时写:

在pom文件中
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>2.7.18</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
<exclusions>
<exclusion>
<artifactId>spring-expression</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
<optional>true</optional> <!-- 注意这里,用户引用此模块,spring会自动使用用户的版本 -->
</dependency>
<!-- 省略其他 -->
</dependencies>
5. Demo代码
https://github.com/handsometaoa/condition_on_class-demo (可结合代码、本地执行进行理解)
关于ConditionalOnClass注解的更多相关文章
- springboot的@ConditionalOnClass注解
大家好,我是"良工说技术". 今天给大家带来的是springboot中的@ConditionalOnClass注解的用法.上次的@ConditionalOnBean注解还记得吗? ...
- Spring Conditional注解使用小结
今天我们来总结下Conditional注解的使用. Conditional注解 增加配置类Config package condition; import org.springframework.co ...
- 【玩转SpringBoot】用好条件相关注解,开启自动配置之门
自动配置隐含两层含义,要搞清楚 上帝让程序员的发量减少,是为了让他变得更聪明,如果有一天聪明到了极点,那就是绝顶聪明. 据说在大脑高速运转下,这样更有利于散热,不至于核心温度过高而产生告警. 聪明的大 ...
- SpringBoot自动化配置之四:@Conditional注解详解
前言 之前在分析spring boot 源码时导出可见@ConditionalOnBean 之类的注解,那么它到底是如何使用的以及其工作流程如何,我们这里就围绕以下几点来分析: @Conditiona ...
- 玩转SpringBoot用好条件相关注解,开启自...
官方提供的常用条件注解 因为Spring的核心是基于bean的,所以这些条件注解主要是影响bean的注册. 因为注册的bean不同了,最后对外呈现的行为就不同了.不就是自动配置了. 一.最常用的应该是 ...
- 助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三)
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 如何分析SpringBoot源码模块及结构?--SpringBoot源码(二) 上一篇分析了SpringBoo ...
- Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...
- Spring boot ConditionalOnClass原理解析
Spring boot如何自动加载 对于Springboot的ConditionalOnClass注解一直非常好奇,原因是我们的jar包里面可能没有对应的class,而使用ConditionalOnC ...
- 死磕Spring之AOP篇 - Spring AOP注解驱动与XML配置
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 精尽Spring Boot源码分析 - 剖析 @SpringBootApplication 注解
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
随机推荐
- 强!70.3K star ! 推荐一款功能强大、开源、可视化的性能实时监控系统:Netdata
在当今复杂多变的IT环境中,系统性能的实时监控与分析对于确保业务连续性.系统稳定运行以及快速故障排查至关重要.随着云计算.大数据和微服务架构的普及,对监控系统的要求也日益增高. 今天给大家推荐一款性能 ...
- TimesURL: 用于通用时间序列表征学习的自监督对比学习《TimesURL: Self-supervised Contrastive Learning for Universal Time Series Representation Learning》模型代码运行解析
现在是2024年3月25日16:17,打算好好的跑一个模型的代码,之前都没有系统性的过一遍,打算拿这个模型的代码开刀,Go,环境和乱七八糟的已经配好了. 关于这篇论文,之前写了博客,里面也有Githu ...
- SQL Server – 执行计划和各种 join 方式 (Execution plan & Join Pattern)
前言 我几乎从来没有遇到过性能问题, 毕竟项目真的太小了. 一般上只要用常识去建 index 就可以了. 但是这并不阻碍我对知识的追求. 这篇是关于一些性能优化和原理的内容. 纯属学习, 希望未来有机 ...
- Qt连连看(一)需求分析
虽然开发经验并不多,但是结合以往的一点实践项目和理论学习,自认为不管是开发什么工程项目,只要遵循软件工程的构建原则,如选择一个合理的架构体系,再掌握一门语言,利用数据结构组织数据,算法实现想法和功能, ...
- 应聘软件测试 HR 会问到哪些问题?收藏这一篇就够了!
1.你还有收到其他offer吗? 其实hr问你offer情况,是对你感兴趣,想要进一步了解你,看下你的市场竞争力. 但注意不要太坦诚的说:我还没有offer或者收到两个offer还想对比对比:也不要撒 ...
- Foxmail 设置个人签名的方法
事件起因: 在foxmail设置一个好看的个人签名 具体设置过程: 打开Foxmail - 右上角设置 -写邮件 签名的设置 字体格式:等线 10px 黑色 内容: 名字 | 名字英文 职位 个人邮箱 ...
- ModbusTCP通信协议分析
前言 大家好!我是付工.前面给大家介绍了一系列关于RS485与Modbus的知识. 终于有人把RS485说清楚了 终于有人把Modbus说明白了 通透!终于把ModbusRTU弄明白了 今天跟大家聊聊 ...
- 2024年5月中国数据库排行榜:OP持续领跑,GoldenDB稳步上升进前八
入夏时节,2024年5月的中国流行度排行榜排行榜如期发布.在这个骄阳似火的季节,各大数据库产品之间的竞争愈发激烈,名次间的细微变动展示了市场的动态和活力.各家厂商不断创新,通过技术升级和性能优化,力求 ...
- Android 扫码枪输入时屏蔽软键盘和顶部状态栏
这是个扫码枪回车输入扫码内容的界面,常用于收银收款等场景 前期踩了很多坑,网上的资料也因为 Android 历史版本不同有各种兼容问题,最后总结了下 在无霸屏设置的 android 设备上使用如下方案 ...
- Maven的安装部署(不踩雷版)
在idea中配置maven需注意maven版本和idea版本相匹配.本人使用idea版本为2020.3,jdk1.8,maven3.6.3可以与之相匹配. 一.下载maven maven下载官网地址: ...