07小节:什么是SpringBoot-Starter?
作者:程序员马丁
热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。
什么是SpringBoot-Starter?元数据信息:
- 什么是线程池oneThread:https://t.zsxq.com/5GfrN
- 代码仓库:https://gitcode.net/nageoffer/onethread —— 申请项目权限参考上述线程池项目链接
- 章节难度:★★☆☆☆ - 中等
- 视频地址:本章节内容简单,无
©版权所有 - 拿个offer-开源&项目实战星球专属学习项目,依据《中华人民共和国著作权法实施条例》和《知识星球产权保护》,严禁未经本项目原作者明确书面授权擅自分享至 GitHub、Gitee 等任何开放平台。违者将面临法律追究。
内容摘要:SpringBoot Starter 就像开发者的贴心“料理包”——一行依赖,配料齐全,配置就绪,让你从此告别东拼西凑,专注业务本味。
课程目录如下所示:
- 引子:SpringBoot 的“小帮手”
- Starter 核心原理揭秘
- 为什么会有 Starter?解决了哪些问题?
- SpringBoot 2.x 与 3.x Starter 机 制对比
- 常用的 SpringBoot 官方 Starters 列表
- 最小可运行的自定义 Starter 示例
- 文末总结
引子:SpringBoot 的“小帮手”
试想一下,在传统开发中我们要使用某个框架功能(比如数据库访问或消息队列),常常需要东拼西凑地添加一堆依赖,还要配置各种参数。这就像下厨做菜前,还得满世界找食材、调料,步骤繁琐又容易出错。而 Spring Boot Starter(启动器)就像一个贴心的“大厨助手”或 预先配好的料理包,帮我们一次性备齐所需“食材”(依赖)和默认配置,让开发者开箱即用,少操很多心。Spring Boot Starter 用轻松的话来说,就是 Spring Boot 世界里的“小帮手”,只要把它引入项目,它就会自动帮你准备好相关技术栈需要的各种依赖,并且偷偷帮你做好配置工作。结果就是,你只需要专注于业务逻辑,许多底层繁琐的配置都被默默安排妥当了。
举个例子,之前如果想要让项目具备 Web 服务能力,需要引入以下依赖。你开始迷茫:这么多依赖,我到底应该用哪个?为什么我需要记住这么多东西?
事实上,在 Spring Boot 出现之前,这种“选择困难症”确实困扰了很多人,包括我。正经人谁会记那么多依赖地址呢。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.x.x.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.x.x.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.x.x.RELEASE</version>
</dependency>
为了解决这个问题,Spring 团队给出了一个非常人性化的方案:Spring Boot Starter。
用大白话讲,Starter 就像是一个礼盒。里面装好了你想要的所有东西(依赖和配置),你只需要一个依赖,整个功能全都给你安排妥当。想用 Web 功能吗?加上一个依赖就行了:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
发现什么了吗?没错,甚至连版本号都不需要写,因为 SpringBoot 已经帮你统一管理了。
Starter 背景与作用
在没有 SpringBoot 的年代,引入第三方组件通常意味着要在 Maven/Gradle 里添加多个坐标依赖,然后再去查文档写大量配置文件,非常麻烦**(依赖版本不匹配、配置分散各处都是常见痛点)**。SpringBoot 提出了“约定优于配置”的理念,Starters 正是这一理念的产物。Starter 的作用简单来说有以下几点:
1. 依赖管理一站式
一个 Starter 包含了一组相关的依赖,就像“自助套餐”。你加上一个 Starter,相当于引入了一系列经过官方测试搭配好的依赖,避免了自己挨个寻找版本兼容的库。例如,要使用 Spring Data JPA 访问数据库,只需添加 spring-boot-starter-data-jpa
,它会自动引入 Spring Data JPA、Hibernate 以及数据库连接 池等必要组件。不再需要东翻西找依赖,一个 Starter 就帮你打包好了所有常用库。
2. 自动配置减负
Starter 配合 Spring Boot 的自动装配机制,能够根据类路径上的依赖自动进行默认配置。这意味着许多以前需要写的样板配置代码,现在 Spring Boot 会替你完成。例如,引入 spring-boot-starter-web
后,由于类路径有 Spring MVC 和 Tomcat,应用启动时会自动配置好 DispatcherServlet、嵌入式 Tomcat 容器等,开发者无需再写XML或@Bean去配置这些。Starter 大大减少了配置分散的问题,将繁琐的配置集中在框架内部约定好,让我们专注于少量必要的属性调整即可。
3. 开箱即用的默认
大多数 Starter 都提供了一套合理的默认行为。例如 spring-boot-starter-logging
会默认使用 Logback 日志框架,spring-boot-starter-web
默认使用 Tomcat 容器并开启 Spring MVC。这些默认配置遵循官方最佳实践,避免了开发者从零开始配置。同时如果默认不符合要求,我们仍可以通过 application.properties/yaml 来微调参数,Spring Boot 会自动将配置绑定到对应组件。可以说,Starter 实现了“约定优于配置”:在有合理默认的前提下,减少开发者的选择成本和配置工作量。
概括来说,Spring Boot Starter 的出现解决了依赖管理杂乱和配置碎片化的问题。过去可能我们需要拷贝粘贴各种依赖坐标、写很多配置,现在只需引入一个 Starter,绝大部分配置就帮你默默搞定。这也是为什么 Spring Boot 能让项目搭建变得如此简单快速的关键原因之一。
Starter 核心原理揭秘
Starters 之所以能做到“引入即用”,背后离不开 Spring Boot 自动装配(Auto-Configuration)机制 的支撑。下面让我们以拟人化的方式,跟随 Spring Boot 的启动流程,看看 Starter 是如何把相应功能自动注入到应用中的:
当我们在主应用类上标注了 @SpringBootApplication
(其内部含有@EnableAutoConfiguration
注解)时,Spring Boot 会在启动时做如下事情:
1. 搜集候选自动配置类
Spring Boot 利用 SpringFactoriesLoader
去扫描应用类路径下所有 JAR 包里的特殊配置文件。对于 Spring Boot 2.x,这个文件就是每个 Starter JAR 中 META-INF/spring.factories
;而在 Spring Boot 3.x,这个机制有所改变,变成在每个 Starter JAR 中查找 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件。这两个文件本质上都是列出该 Starter 提供的自动配置类列表