第九节 设计 Starter 不能忽视的细节

我们要定义一个生产可用的 Starter ,还有几个细节,我们必须要关注。这些细节可以很好的帮助我们写出更优秀的 Starter

一、maven 包依赖

每一个 Starter,可以理解为一个 Jar,这个 Jar 包,如果被其他应用引用,将会引发很多问题,

比如 Jar 包冲突。我们可以参考一些工具包是如何管理他们的 maven 的。

1.1 maven 之 optional

下面是 hutool 包中 maven

那么 optional 的作用是什么呢?

在 Maven 项目中,<optional>true</optional>标记用于依赖声明中,表明这个依赖对当前项目是可选的,而不是必需的。这意味着,当其他项目引用声明了这个可选依赖的项目时,这个可选依赖不会自动被包含进那些项目的依赖树中。

具体来说,这个标记的主要作用包括:

避免依赖传递:当项目A包含一个标记为<optional>true</optional>的依赖B时,如果有另一个项目C依赖于项目A,那么B不会被自动包含为C的依赖。避免依赖传递带来的潜在问题,例如版本冲突或不必要的依赖膨胀。

模块化设计:通过将某些功能依赖标记为可选,你可以设计出更加模块化的项目。这样,用户可以根据需要选择是否引入这些功能,这对于创建具有插件或可扩展特性的库和框架尤其有用。

因此,我们在设计 Starter 依赖的时候,对于一些依赖包,我们也可以选择使用 <optional>true</optional>。减少因为引入我们的 Starter 而代理的依赖传递。

例子:我们选择将 spring-boot-starter 标签设置 optional 为 true。

一旦 Starter 发布为 Jar ,那么版本就固定了。所以设置 optional 为 true,是一种好习惯。

1.2 maven 之 scope

我们有时候,希望引入的依赖,由容器提供。打包程序的时候不再引入,这个时候我们可以考虑设置 scope 的属性。

在编译和测试时,项目需要这个依赖,但是在运行时环境中,这个依赖已经存在,不需要打包进来。这一点是十分重要的。

在打包阶段,Maven 不会将 scope 为 "provided" 的依赖项包含进最终构建的 JAR、WAR 或 EAR 文件中。

举例:如果某个项目 A 依赖于项目 B,并且项目 B 中有一个 "provided" scope 的依赖 C,那么依赖 C 不会传递给项目 A。项目 A 必须显式声明对 C 的依赖才能使用它,除非也是将其声明为 "provided"

因此,我们在设计一个 Starter 的时候,是非常有必要关注这两个属性的。不要因为引入我们的 Starter,而给使用方带来更多的问题。

  1. 减少包大小:如果你的应用将要部署到提供了某些库的环境中,那么没有必要将这些库打包到你的应用中。通过将这些依赖的 scope 设置为 ,可以减小最终的包大小,加快部署速度并减少资源占用。
  2. 避免版本冲突:如果运行时环境已经提供了某个库的某个版本,而应用也包含了这个库的另一个版本,这可能会导致版本冲突。通过使用 scope,可以确保应用使用的是环境中已经存在的那个版本,从而避免冲突。

大多数 jar 是被 springBoot 引用使用, 这个时候,如果有中间件的情况,可以考虑将 Starter 中的一些中间件设置成 provided。从而避免重复地引入

虽然使用 scope 有其好处,但也需要注意确保运行时环境确实提供了这些依赖。如果你错误地将某个必需的库标记为 ,而它实际上并未在运行时环境中提供,这可能会导致运行时错误或类找不到的异常。

务必确定版本依赖和版本管理,否则容易出现冲突。

例子:比如在写缓存的 Starter 的时候,把 redis 的依赖设置成 provided。由引入的工程提供 redis

1.3 最新版本依赖

  1. 确保 Starter 不会带来与项目其他部分依赖冲突的库。可以统一公司的版本。
  2. 尽量减少 Starter 的依赖,避免不必要的依赖,以减少应用程序的启动时间和资源消耗。只包括实现功能所必需的依赖库。
  3. 版本包应该遵循 Jar 的规范,线上避免使用 SNAPSHOT 包。

二、编码细节

2.1 命名规范

  • 官方定义的 Starter 通常命名遵循的格式为 spring-boot-starter-{name},例如 spring-boot-starter-data-redis。
  • 非官方 Starter 命名应遵循 {name}-spring-boot-starter 的格式,例如,simplecache-spring-boot-starter

2.2 扩展性

  1. 通过 xxxProperties 等增加扩展性
  2. 通过条件注解实现按需加载

三、兼容性

尽量保持与旧版本的兼容性。当进行更新时,应该注意不要破坏现有用户的配置和使用方式。 由于 Starter 会升级,像 Jar 一样,因此需要注意兼容性,避免因为引入 Starter 而代理不兼容等问题。

不然升级将会异常灾难!

尽量保证版本的一致性,保持大版本的一致性会非常重要和关键。

四、其他注意事项

  1. 尽量不要在 Starter 中使用路径扫描 。类路径扫描不仅可能会扫描到不应该被注册的 bean,而且还会增加应用程序启动的时间。由于Spring Boot旨在简化开发,可能会引入一些不必要的依赖,导致应用启动慢或占用资源多。定期审查依赖和配置,剔除不需要的部分,是一个好习惯
  2. 在文档中清晰说明 Starter 的工作原理、如何配置以及如何与其他模块集成。文档应该详细到用户不需要查看代码就能理解和正确配置 Starter
  3. 使用 @Conditional 注解(如 @ConditionalOnClass@ConditionalOnMissingBean)来确保你的自动配置只有在满足特定条件时才加载。
  4. 虽然Spring Boot的“约定优于配置”大大简化了开发,但完全不理解背后的配置可能会导致问题难以排查。开发人员应该至少了解Spring Boot自动配置的基本原理

五、本章小结

了解这些细节后,接下来给出两个案例,在自己写 Starter 的时候,也一定要注意这些细节,否则它不是一个好的 Starter。

已同步发布到公众号:面汤放盐 

掘金账号:第九节 设计 SpringBoot Starter 不能忽视的细节 - 掘金 (juejin.cn)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go-zero 实战(5)

引入Prometheus 用 Prometheus 监控应用 1. 用 docker 启动 Prometheus 编辑配置位置&#xff0c;我将 prometheus.yaml 和 targets.json 文件放在了 /opt/prometheus/conf目录下 prometheus.yaml global:scrape_interval: 15s # 抓取间隔evaluation_interval: 15s # 评估…

HarmonyOS interface router scale pageTransition SlideEffect.Left ArkTS ArkUI

&#x1f3ac;️create Component export default struct TitleBar {build(){Row(){Text(transition).fontSize(30fp).fontColor(Color.White)}.width(100%).height(8%).backgroundColor(#4169E1).padding({left:10})}}&#x1f39e;️interface export interface IList{ti…

大数据学习之安装并配置maven环境

什么是Maven Maven字面意&#xff1a;专家、内行Maven是一款自动化构建工具&#xff0c;专注服务于Java平台的项目构建和依赖管理。依赖管理&#xff1a;jar之间的依赖关系&#xff0c;jar包管理问题统称为依赖管理项目构建&#xff1a;项目构建不等同于项目创建 项目构建是一…

本地idea连接虚拟机linux中的docker进行打包镜像上传--maven的dockerfile-maven-plugin插件

项目名必须是英文,-,.,_,这些数字,idea需要管理员运行,因为idea控制台mvn命令需要管理员权限才能运行(maven需配置环境变量)改linux中的Docker服务文件,使用2375 进行非加密通信,然后加载重启 2.1 #修改Docker服务文件 vi /lib/systemd/system/docker.service ​ # 通常使…

TI C2000 FLASH 模拟 EEPROM

简述 FLASH和EEPROM同为非易失存储器,互有优势。 FLASH Flash是非易失性存储器(NVM)的一种形式。相对于EEPROM,Flash具有更高的存储密度和更快的写入速度。Flash内部被分为多个扇区,每个扇区都可以单独擦除和写入。但是寿命相比EEPROM较短,以TI芯片为例,flash擦写次数在…

go 微服务框架 kratos 日志库使用方法及原理探究

一、Kratos 日志设计理念 kratos 日志库相关的官方文档&#xff1a;日志 | Kratos Kratos的日志库主要有如下特性&#xff1a; Logger用于对接各种日志库或日志平台&#xff0c;可以用现成的或者自己实现Helper是在您的项目代码中实际需要调用的&#xff0c;用于在业务代码里…

正点原子LWIP学习笔记(三)PHY芯片简介

PHY芯片简介 一、PHY芯片简介&#xff08;了解&#xff09;二、LAN8720A与YT8512C简介&#xff08;熟悉&#xff09;三、PHY地址的设置&#xff08;掌握&#xff09;四、RMII模式选择&#xff08;熟悉&#xff09;五、PHY寄存器简介&#xff08;熟悉&#xff09; 一、PHY芯片简…

AIGC绘画设计基础-建筑设计应用

一、AI及AIGC 对于AI大家都不陌生&#xff0c;但是AIGC这个概念好多人其实不大清楚。“AI”是指人工智能技术本身&#xff0c;而“AIGC”是指基于人工智能技术而生成的内容。 生成式人工智能——AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;&…

Java类和对象(五)—— 抽象类、接口、Object类和内部类

抽象类 在继承体系下&#xff0c;父类有些方法可能是要被重写的&#xff0c;如果我们事先就知道某些方法需要重写的话&#xff0c;我们可以不用在父类里面具体实现这个方法&#xff0c;这时候我们会用到抽象方法&#xff0c;这时候我们会用到关键字abstract关键字来修饰 publ…

Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短信/七牛云存储

源码简介 这套系统是我从以前客户手里拿到的,100完整可用,今天测试防红链接失效了,需要修改防红API即可!前端页面展示我就不放了,懂的都懂 优点是Thinkphp开发的&#xff0c;二开容易。 源码图片 资源获取&#xff1a;Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短…

有些错误,常犯常新、常新常犯:记录一个使用element-plus的tooltip组件的错误

使用element-plus的tooltip组件&#xff0c;最开始的写法是这样的&#xff1a; <el-tooltipclass"box-item"effect"dark"content"tooltip content" ><el-button v-if"isDisabled" :underline"false" type"pr…

【实战】SpringBoot整合Websocket、Redis实现Websocket集群负载均衡

文章目录 前言技术积累什么是Websocket什么是Redis发布订阅Redis发布订阅与消息队列的区别 实战演示SpringBoot整合WebsoketWebsoket集群负载均衡 实战测试IDEA启动两台服务端配置nginx负载均衡浏览器访问模拟对话 前言 相信很多同学都用过websocket来实现服务端主动向客户端推…

Web前端一套全部清晰 ⑨ day5 CSS.4 标准流、浮动、Flex布局

我走我的路&#xff0c;有人拦也走&#xff0c;没人陪也走 —— 24.5.24 一、标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如:块元素独占一行&#xff0c;行内元素可以一行显示多个。 二、浮动 作用: 让块级元素水平排列。 属性名:floa…

瑞米派Ubuntu系统移植指南-米尔RemiPi

1.概述 Linux系统平台上有许多开源的系统构建框架&#xff0c;这些框架方便了开发者进行嵌入式系统的构建和定制化开发&#xff0c;目前比较常见的有Buildroot, Yocto, OpenEmbedded等等。 同时更多的传统的桌面系统也加入到嵌入式环境体系中&#xff0c;如Ubuntu&#xff0c…

启动docker报错:Failed to listen on Docker Socket for the API.

说明&#xff1a; 1、安装部署docker完成后&#xff0c;启动docker报错&#xff1a;Failed to listen on Docker Socket for the API&#xff0c;如下图所示&#xff1a; 2、将SocketGroupdocker更改成&#xff1a;SocketGrouproot即可 一、解决方法&#xff1a; 1、执行命令…

用智能插件(Fitten Code: Faster and Better AI Assistant)修改好了可以持久保存的vue3留言板

天际 第一修改是选项式&#xff1a; <!-- 模板结构 --> <template><div><textarea placeholder"请输入备注内容" v-model"newItem"></textarea><button click"addItem">添加</button><hr><…

Redis 主从复制、哨兵与集群

一、Redis 主从复制 1. 主从复制的介绍 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&a…

【MySQL精通之路】InnoDB(6)-磁盘结构(2)-索引

主博客&#xff1a; 【MySQL精通之路】InnoDB(6)-磁盘上的InnoDB结构-CSDN博客 上一篇&#xff1a; 下一篇&#xff1a; 【MySQL精通之路】磁盘上的InnoDB结构-表空间-CSDN博客 目录 1.聚集索引和二级索引 1.1 Innodb 如何建立聚集索引 1.2 聚集索引如何加快查询速度 1…

大语言模型的工程技巧(一)——GPU计算

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下&#xff1a;regression2chatgpt/ch07_autograd/gpu.ipynb 本文将讨论如何利用PyTorch实现GPU计算。本…

第十一节 SpringBoot Starter 面试题

一、面试题 很多同学的简历都写着熟悉 SpringBoot&#xff0c; 而 Starter 的实现原理被当作的考题的的情况越来越多。 来源牛客网关于 starter 的一些面试题 情景一、路虎一面 情景二、蔚来 情景三、同花顺 Starter 频频出现&#xff0c;因此在面试准备时&#xff0c;这道题…