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注解的更多相关文章

  1. springboot的@ConditionalOnClass注解

    大家好,我是"良工说技术". 今天给大家带来的是springboot中的@ConditionalOnClass注解的用法.上次的@ConditionalOnBean注解还记得吗? ...

  2. Spring Conditional注解使用小结

    今天我们来总结下Conditional注解的使用. Conditional注解 增加配置类Config package condition; import org.springframework.co ...

  3. 【玩转SpringBoot】用好条件相关注解,开启自动配置之门

    自动配置隐含两层含义,要搞清楚 上帝让程序员的发量减少,是为了让他变得更聪明,如果有一天聪明到了极点,那就是绝顶聪明. 据说在大脑高速运转下,这样更有利于散热,不至于核心温度过高而产生告警. 聪明的大 ...

  4. SpringBoot自动化配置之四:@Conditional注解详解

    前言 之前在分析spring boot 源码时导出可见@ConditionalOnBean 之类的注解,那么它到底是如何使用的以及其工作流程如何,我们这里就围绕以下几点来分析: @Conditiona ...

  5. 玩转SpringBoot用好条件相关注解,开启自...

    官方提供的常用条件注解 因为Spring的核心是基于bean的,所以这些条件注解主要是影响bean的注册. 因为注册的bean不同了,最后对外呈现的行为就不同了.不就是自动配置了. 一.最常用的应该是 ...

  6. 助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 如何分析SpringBoot源码模块及结构?--SpringBoot源码(二) 上一篇分析了SpringBoo ...

  7. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  8. Spring boot ConditionalOnClass原理解析

    Spring boot如何自动加载 对于Springboot的ConditionalOnClass注解一直非常好奇,原因是我们的jar包里面可能没有对应的class,而使用ConditionalOnC ...

  9. 死磕Spring之AOP篇 - Spring AOP注解驱动与XML配置

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  10. 精尽Spring Boot源码分析 - 剖析 @SpringBootApplication 注解

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

随机推荐

  1. EntityFramework Core并发迁移解决方案

    场景 目前一个项目中数据持久化采用EF Core + MySQL,使用CodeFirst模式开发,并且对数据进行了分库,按照目前颗粒度分完之后,大概有一两百个库,每个库的数据都是相互隔离的. 借鉴了G ...

  2. Avalonia upgrade from 0.10 to 11.x

    Avalonia 从0.10版本升级到11.x版本.由于11.x新版本与旧版本对比发生了破坏性的变化,因此官方给出了升级的攻略可以参考. https://docs.avaloniaui.net/doc ...

  3. Spring 之 RestTemplate VS WebClient 发送 HTTP请求

    WebClient 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifact ...

  4. LeetCode 1349. 参加考试的最大学生数 (状压DP 或 二分图最大独立子集)

    给你一个 m * n 的矩阵 seats 表示教室中的座位分布.如果座位是坏的(不可用),就用 '#' 表示:否则,用 '.' 表示. 学生可以看到左侧.右侧.左上.右上这四个方向上紧邻他的学生的答卷 ...

  5. 1.2 HELLO 三角形

    这一节,我觉得是相当有难度的.渲染一个三角形,就需要介绍GLSL语言,图形渲染管线(Graphics Pipeline)以及着色器(Shader),标准化设备坐标(NDC)等诸多概念. 图形渲染管线和 ...

  6. 2023年5月中国数据库排行榜:OTO组合回归育新机,华为高斯蓄势待发展雄心

    路漫漫其修远兮,吾将上下而求索. 2023年5月的 墨天轮中国数据库流行度排行 火热出炉,本月共有262个数据库参与排名.本月排行榜前十变动较大,可以用一句话概括为:openGauss 立足创新夺探花 ...

  7. 2020年度国产数据库:openGauss

    根据墨天轮2020年一年的数据库流行度得分趋势变化,我们选出了流行热度增长显著的数据库为2020年度国产数据库.恭喜 华为开源关系型数据库 openGauss 荣获 "2020年度国产数据库 ...

  8. NVM使用说明

    下载:https://github.com/coreybutler/nvm-windows/releases 切换镜像源:  settting.txt文件后面添加 node_mirror: https ...

  9. vue本地项目启动时遇到coreJs相关报错问题处理

    启动项目的时候报错 : 是因为core.js这个包丢失,需要大家重新下载即可 : yarn add core-js

  10. 大模型存储选型 & JuiceFS 在关键环节性能详解

    从去年开始,LLM大语言模型领域发展迅速.如 LLaMA.ChatGLM.Baichuan.Qwen 和 yi-model 等基础模型(Foundation Models)的数量显著增加.众多企业也开 ...