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. Asp.net core 学习笔记之 authen + autho + oidc + oauth + spa 第九篇 (external login)

    External login 就是指通过 Google, Microsoft, Facebook account 做登入. https://docs.microsoft.com/en-us/aspne ...

  2. CMake构建学习笔记16-使用VS进行CMake项目的开发

    目录 1. 概论 2. 详论 2.1 创建工程 2.2 加载工程 2.3 配置文件 2.4 工程配置 2.5 调试执行 3. 项目案例 4. 总结 1. 概论 在之前的系列博文中,我们学习了如何构建第 ...

  3. Windows 调试工具课程

    本文是我在集团内部上的课程记录而成的博客内容.在本次课程里面将和大家介绍一些在 Windows 上常用的调试工具,以及调查问题的常见套路.适合于伙伴们入门 Windows 调试 本文以下内容是采用原本 ...

  4. Spirng Aop 实现自定义注解及实现

    需求:日志记录 需要记录当前用户访问的每个接口对应的前端页面功能信息 声明一个注解 @Documented @Retention(RetentionPolicy.RUNTIME) @Target({E ...

  5. SXYZ-6.27专题比赛

    好的,现在正式定义今天的比赛为一场伤心的比赛. ↑这张图片首先能说明一些问题,但这并不是关键. ↓这才是伤心的关键 ↑第一题文件输入输入爆 ↑第二题文件名直接爆 评语,一个比一个离谱! 然后只是很简单 ...

  6. 【赵渝强老师】史上最详细的PostgreSQL体系架构介绍

    PostgreSQL是最像Oracle的开源数据库,我们可以拿Oracle来比较学习它的体系结构,比较容易理解.PostgreSQL的主要结构如下: 一.存储结构 PG数据存储结构分为:逻辑存储结构和 ...

  7. centos 下安装pip pip3

    centos 下安装pip pip3 上一篇说过了如何在centos7 上安装python3 并与python2.7共存. 这篇说一下 安装python2.7 下安装的pip 以及python3 下的 ...

  8. CMake 属性之目标属性

    [写在前面] CMake 可以通过属性来存储信息.它就像是一个变量,但它被附加到一些其他的实体上,像是一个目录或者是一个目标.例如一个全局的属性可以是一个有用的非缓存的全局变量. 在 CMake 的众 ...

  9. linux内核 快速分片,技术|Linux slabtop命令——显示内核片缓存信息

    Linux内核需要为临时对象如任务或者设备结构和节点分配内存,缓存分配器管理着这些类型对象的缓存.现代Linux内核部署了该缓存分配器以持有缓存,称之为片.不同类型的片缓存由片分配器维护.本文集中讨论 ...

  10. 标准库之 random 模块

    一.介绍random模块 1.1.random模块简介 random模块是Python标准库中用于生成伪随机数的模块,伪随机数是通过算法生成的数列,在一定范围内表现出随机性,虽然这些数列在一定程度上是 ...