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

2024-05-25 01:36

本文主要是介绍第九节 设计 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)

这篇关于第九节 设计 Starter 不能忽视的细节的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1000108

相关文章

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

电脑软件不能安装到C盘? 真相颠覆你的认知!

《电脑软件不能安装到C盘?真相颠覆你的认知!》很多人习惯把软件装到D盘、E盘,刻意绕开C盘,这种习惯从哪来?让我们用数据和案例,拆解背后的3大原因... 我身边不少朋友,在使用电脑安装软件的时候,总是习惯性的把软件安装到D盘或者E盘等位置,刻意避开C盘。如果你也有这样的习惯,或者不明白为什么要这么做,那么我

vscode不能打开终端问题的解决办法

《vscode不能打开终端问题的解决办法》:本文主要介绍vscode不能打开终端问题的解决办法,问题的根源是Windows的安全软件限制了PowerShell的运行,而VSCode默认使用Powe... 遇到vscode不能打开终端问题,一直以为是安全软件限制问题,也没搜到解决方案,因为影响也不大,就没有管

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

SpringCloud负载均衡spring-cloud-starter-loadbalancer解读

《SpringCloud负载均衡spring-cloud-starter-loadbalancer解读》:本文主要介绍SpringCloud负载均衡spring-cloud-starter-loa... 目录简述主要特点使用负载均衡算法1. 轮询负载均衡策略(Round Robin)2. 随机负载均衡策略(

SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题

《SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题》dynamic-datasource-spring-boot-starter是一... 目录概要整体架构构想操作步骤创建数据源切换数据源后续问题小结概要自己闲暇时间想实现一个多租户平台,

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring