第一节 为什么会是 SpringBoot Starter
tips:本系列文章中 Starter,除 xxx-starter 等用小写,其他都以大写开头。
一、我与 Starter 的一些故事
1.1 多云架构的升级经历
一套代码多个环境运行
2021 年有幸参与了公司的多云架构升级,将应用从私有云改造升级,以便支持信创环境、公有云环境等多环境。 达到 一套代码在多个环境上运行。
saas 行业非常普遍,大客户想让产品部署到自己的环境; 小客户没有更多预算,因此选择公有云的 saas 版。由于诉求不同,常常会出现多个分支版本,如果依赖的中间件不支持,则还需进行改造。
中间件的依赖
由于环境不同、技术选型不同;常常出现不同的套装组合。
如何实现这样复杂的场景呢?有很多主张,当然都各有优劣。
- 多分支
- if...else
- Starter
- ......
PK 过后,最终选择了 Starter。结果也证明了它确实是不错的选择。
Starter 的方式。
在这一次的改造过程中,我全面认识了 Starter 的优势。
各个环境依赖接口层,中间件的具体实现,以 Starter 高度模块化下层到底座,通过按需加载,实现多环境的适配。
1.2 Starter 被复用的经历
将通用性和变化性进行解耦,抽象并下沉通用部分,从而实现代码的可移植性。
做过一次技术分享,主题是围绕一个具体场景,沉淀了通用的 Starter。 不久后,其他兄弟部门遇到了这样的场景,然后它把我的 Starter 集成到了他们的应用里面了。
1.3 面试者和面试官
作为面试者
当我说我熟悉 SpringBoot 的时候,面试官总会说,你能说说 SpringBoot Starter 的原理吗?
那个时候的我: 嗯.... 支支吾吾
作为面试官
这些年,也当过多次面试官,在校招和社招的面试经历中,也用这道题面试过不少同学,大多数都能答上来一些,但能把这题答好的并不多。
现在看来,这不仅仅是一道面试题,而是工作中确实有实用的技能。
那么 SpringBoot Starter 为什么会如此受欢迎呢,接着往下看
二、SpringBoot Starter 为什么如此受欢迎
在开发 SpringBoot 项目的时候,随处可见 Starter 的身影,现在几乎所有的中间件都以 Starter 的方式集成到 SpringBoot 的应用中。现在已经形成了一个庞大的生态。
自定义的或者第三方的 Starter 命名推荐: module−spring−boot−starter,而SpringBoot官方的Starter则更多采用spring−boot−starter−{module}-spring-boot-starter , 而 SpringBoot 官方的 Starter 则更多采用 spring-boot-starter-module−spring−boot−starter,而SpringBoot官方的Starter则更多采用spring−boot−starter−{module} 的模式。
2.1 随处可见的 Starter
Spring Boot 提供了许多官方的 Starter,用于支持各种集成和开发场景。如下所示:
starter | 描述 |
---|---|
spring-boot-starter | 核心 starter,包括自动配置支持、日志库和Spring核心功能 |
spring-boot-starter-web | 用于构建Web应用程序,包括RESTful应用程序,使用Spring MVC |
spring-boot-starter-data-jpa | 包括Spring Data JPA与Hibernate的支持,用于数据库访问 |
spring-boot-starter-security | 用于添加Spring Security的支持 |
spring-boot-starter-data-redis | 使用Spring Data Redis和lettuce客户端访问Redis数据存储 |
..... | ..... |
除去官方的,还有三方的 Starter,如下所示:
starter | 描述 |
---|---|
mybatis-spring-boot-starter | mybatis快速集成 SpringBoot的 |
pagehelper-spring-boot-starter | 分页starter |
..... | ..... |
当然还有大量自建的 Starter。 那么 Starter 都有哪些优秀特性,才让它成为当前时代的 Java 编程语言的宠儿。
2.2 Starter 的优秀特性
高度模块化: Spring Boot Starter 是一种实现应用模块化、功能解耦的有效手段。通过将某一特定功能所需的依赖、配置和服务封装成一个独立的模块,使得开发者在引入该功能时只需简单地添加 Starter 依赖,无需关注底层复杂的配置和实现细节。
高度可扩展性:自定义 Starter 也具有良好的扩展性,可以根据需要随时添加新的功能或者调整已有功能,比如在多环境中,快速增加场景实现。
简化配置、快速集成: 大量中间件以 Starter 方式快速集成,简化了大量配置,使得 SpringBoot 应用开发变得异常简单;很多常见应用场景无需编写或仅需少量配置代码就能快速启动服务,极大地提高了开发效率。
可移植可复用:轻量简单,以 Jar 的方式,被传播和复用
Starter 是 SpringBoot 约定大于配置的优秀体现,简化了构建配置和依赖管理。
2.3 自定义 Starter 的场景
场景举例:
-
集成第三方服务:例如,为某个云服务商提供的消息队列服务创建一个 Starter,当应用需要接入该服务时,只需要引入这个 Starter 即可完成相关的客户端依赖、认证信息以及连接配置等步骤。
-
组织内部框架整合:如果公司内部有一些共用的基础组件或中间件,比如统一的日志框架、监控系统、权限管理模块等,可以将其封装成自定义 Starter,方便各项目快速复用和部署。
-
标准化项目初始化:针对特定类型的项目(如微服务项目、数据处理项目),可以创建一个包含基础环境搭建、安全设置、健康检查等功能的 Starter,确保每个新项目从一开始就遵循了最佳实践和一致的标准。
总的来说,Starter 容易使用, 它简化了依赖管理,实现了自动配置,增强了扩展性,对于使用者来讲,也降低了学习成本,总体而言, Spring Boot Starter 是一种促进模块化、解耦、易用性和高效开发的重要工具。
三、Starter 与工具包的区别
Spring Boot Starter 和工具包(库)在 Java 项目开发中都扮演重要的角色,但它们的目的和应用方式有所不同并各有特点。理解这两者之间的区别有助于更合理地组织和构建应用程序。
Spring Boot Starter: 是一种特殊类型的 Maven 项目或 Gradle 项目依赖,简化 Spring 应用的初始搭建和配置工作。Starter 包含了一组自动配置的预设,依赖库和其他必需的配置,使得开发者能够快速启动和运行一个特定的功能或模块,无需从头开始手动配置所有细节;以解决特殊的场景为目的,并依赖 Spring,内部的各个类相互协助以对外提供能力。
工具包或库(Library) :是封装了一组特定功能的代码和资源的集合,旨在被其他项目作为依赖引入,以提供特定的功能或服务,由一系列 util 类组成。与 Starter 相比,库更加专注于实现特定的功能,并不涉及项目的自动配置,工具包中可以互相独立,不相互协作对外提供功能。
在实际开发中,Starter 和工具包通常会一起使用。通过合理选择和使用 Starter 和工具包,可以大大提高项目的开发效率,减少重复的配置工作,同时保证项目的可维护性和可扩展性。
四、最后小结
本章讲了三个小故事,然后谈到了 Starter 的特性和应用场景,以及和工具包之间的区别。 Starter 有着优秀 feature 以及广泛的应用场景,值得我们认真学习和深入研究。下面将开启 Starter 的学习之旅。
转载自:https://juejin.cn/post/7371641316113825828