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

news2024/11/15 6:55:39

我们要定义一个生产可用的 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)

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

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

相关文章

FIFO-Diffusion,一个无需额外训练即可生成长视频的框架。通过确保每个帧引用足够多的先前帧来生成高质量、一致的长视频。

简单来讲&#xff0c;FIFO-Diffusion先通过一些模型如VideoCraft2、zeroscope、Opem-Sora Plan等与FIFO-Diffusion的组合生成短视频&#xff0c;然后取结尾的帧&#xff08;也可以取多帧&#xff09;&#xff0c;再用这一帧的图片生成另一段短视频&#xff0c;然后拼接起来。FI…

CentOS-7安装教程

目录 安装 修改主机名 配置静态IP 镜像下载地址 https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso VMware Workstation Pro下载 VMware Workstation Pro各版本下载&#xff08;2024.5.5之后&#xff09;(Windows与Linux安装包不限…

MilvusPlus向量数据库增强操作库

项目简介 &#x1f525;&#x1f525;&#x1f525;MilvusPlus&#xff08;简称 MP&#xff09;是一个 Milvus 的操作工具&#xff0c;旨在简化与 Milvus 向量数据库的交互&#xff0c;为开发者提供类似 MyBatis-Plus 注解和方法调用风格的直观 API,提高效率而生。 特性 无侵入…

【C++11】列表初始化,std::initializer_list和模版可变参数

一.列表初始化 一切对象都可以用大括号括起的列表来初始化。 //构造 Date d1(2024, 5, 24); Date d2{2024, 5, 24};//三个构造 new Date[3]{{2024, 5, 23}, {2024, 5, 24}, {2024, 5, 25}};//构造(隐式)拷贝构造 优化->一次构造 Date d3 {2024, 5, 24}; 二. std::initiali…

基于STM32实现智能空气质量监测系统

目录 文章主题环境准备智能空气质量监测系统基础代码示例&#xff1a;实现智能空气质量监测系统 配置传感器并读取数据数据处理与显示数据存储与传输应用场景&#xff1a;室内环境监测与空气质量控制问题解决方案与优化收尾与总结 1. 文章主题 文章主题 本教程将详细介绍如何…

AI视频智能分析技术:EasyCVR视频汇聚安防监控智能化方案

1、视频智能分析技术原理 视频智能分析技术是一项基于计算机图像视觉分析技术的创新解决方案。它利用先进的算法&#xff0c;将视频场景中的背景和目标进行有效分离&#xff0c;从而实现对目标的精准分析和追踪。 该技术可以对监控摄像头拍摄到的视频进行分析和识别&#xff0…

Java+Spring+ MySQL + MyCat云HIS有哪些优势?智慧医疗云(HIS)低成本与安全保障的完美结合

JavaSpring MySQL MyCat云HIS有哪些优势&#xff1f;智慧医疗云(HIS)低成本与安全保障的完美结合 云HIS的优点包括节省成本、便捷高效、稳妥安全等。通过云HIS&#xff0c;医疗机构无需在本地建立机房、购买服务器和应用软件&#xff0c;降低了硬件和人力成本。同时&#xff0…

OpenWrt改网桥模式(AP模式)

OpenWrt改网桥模式&#xff08;AP模式&#xff09; 点击“接口” 删掉所有 wan 接口 点击“设备”&#xff0c;配置“br-lan" 点击网桥接口&#xff0c;勾选所有接口 点击保存 添加新接口&#xff08;不添加的话路由器自身系统没网&#xff09; 返回 “网络” - “接…

AI大模型的口语练习APP

开发一个使用第三方大模型的口语练习APP涉及多个步骤&#xff0c;从需求分析到部署上线。以下是详细的开发流程和关键步骤&#xff0c;通过系统化的流程和合适的技术选型&#xff0c;可以有效地开发出一个功能丰富、用户体验良好的口语练习APP。北京木奇移动技术有限公司&#…

景源畅信电商:抖店需要的成本高吗?

在数字化时代的浪潮中&#xff0c;短视频平台迅速崛起&#xff0c;成为连接用户与商家的新桥梁。抖音作为其中的佼佼者&#xff0c;不仅改变了人们的娱乐方式&#xff0c;也催生了新型的电商模式——抖店。许多人好奇&#xff0c;入驻这样一个充满活力的平台&#xff0c;需要承…

C++ (week4):Linux基础

文章目录 零、Linux简介1.配置环境2.Linux历史3.Linux模型 一、vim二、Linux命令行 (shell命令)1.常用命令与快捷键(1)常用命令①man命令&#xff1a;查看帮助手册 (2)快捷键 2.用户子系统(1)Linux用户(2)用户命令 3.文件子系统命令(1)目录命令1.创建文件&#xff1a;mkdir2.删…

优于InstantID!中山大学提出ConsistentID:可以仅使用单个图像根据文本提示生成不同的个性化ID图像

给定一些输入ID的图像&#xff0c;ConsistentID可以仅使用单个图像根据文本提示生成不同的个性化ID图像。效果看起来也是非常不错。 相关链接 Code:https://github.com/JackAILab/ConsistentID Paper&#xff1a;https://ssugarwh.github.io/consistentid.github.io/arXiv.pd…

【openlayers系统学习】4.1渲染矢量瓦片、VectorTile 层

一、VectorTile 层 我们现在知道如何加载切片图像&#xff0c;并且已经看到了加载和渲染矢量数据的不同方法。但是&#xff0c;如果我们能够拥有快速传输到浏览器的切片&#xff0c;并且可以动态样式化&#xff0c;那该多好啊&#xff1f;这就是矢量切片的用途。OpenLayers 通…

ubuntu_概念

su(switch user) wget(Web Get) cd(change directory) dpkg(Debian Packager)为 “Debian” 专门开发的套件管理系统&#xff0c;方便软件的安装、更新及移除。 chmod(Change Mode)用于改变文件或目录的权限 ps(Process Status)进程状态 grep(Global Regular Expression Print)…

C++利用TinyXML读取XML文件

TinyXML是什么&#xff1f; TinyXML是一个轻量级的C XML解析器&#xff0c;它提供了一种简单的方法来解析和操作XML文档。TinyXML被设计为易于使用和集成到C项目中&#xff0c;并且非常适合处理小型XML文件。 以下是TinyXML的一些主要特点和优点&#xff1a; 轻量级: T…

李良济中医课堂走进老年大学,倪金山医生讲座守护老年人脊柱健康

5月21日&#xff0c;李良济中医课堂走进姑苏区老年大学&#xff0c;特别邀请倪金山医生&#xff0c;为老年朋友带来“脊柱健康”专题课。 中医课堂上&#xff0c;倪金山医生贴合老年人的身体健康&#xff0c;详细为老年朋友们分享脊柱对身体健康的重要性&#xff0c;如何预防脊…

[笔试训练](三十二)094:素数回文095:活动安排096:合唱团

目录 094:素数回文 095:活动安排 096:合唱团 094:素数回文 题目链接:素数回文_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 模拟题&#xff1a; 1.构造回文数 2.检测是否为素数 #include <iostream> #include <string> #include <c…

商品发布功能

文章目录 1.SPU和SKU介绍1.SPU2.SKU3.两者之间的关系 2.完成商品发布界面1.组件引入1.commoditylaunch.vue 引入到 src/views/modules/commodity下2.multiUpload.vue 引入到 src/components/upload/multiUpload.vue 2.创建菜单1.创建目录2.创建菜单&#xff0c;注意菜单路由要匹…

《艺术大观》知网艺术刊:可加急, 出刊上网快

《艺术大观》 《艺术大观》征文通知 《艺术大观》期刊诚邀学者、艺术家和文化工作者积极投稿&#xff0c;共同探索艺术领域的前沿问题&#xff0c;促进学术交流和艺术创作的发展。我们欢迎各类艺术形式的研究与评论&#xff0c;包括但不限于绘画、雕塑、音乐、舞蹈、戏剧、电…