1-5.SpringBoot简介
约 2304 字大约 8 分钟
2025-07-15
SpringBoot 是由 Pivotal 团队提供的全新框架,旨在简化 Spring 应用的初始搭建和开发过程。它主要通过简化以下两个方面来达成此目的:
- 依赖设置繁琐: 原始 Spring 程序需要手动添加各种依赖,而 SpringBoot 通过起步依赖简化了依赖配置。
- 配置繁琐: 原始 Spring 程序需要编写大量的配置类或配置文件,SpringBoot 通过自动配置简化了常用工程的相关配置。
1. SpringBoot 程序的简化操作
SpringBoot 程序的简化操作主要体现在以下三个方面:
- 起步依赖 (Starter): 简化依赖配置的书写。
- 自动配置: 简化常用工程的相关配置。
- 辅助功能: 例如内置服务器等。
下面将结合入门程序来说明这些简化操作在哪些方面体现。
2. Parent
2.1 Parent 的作用
SpringBoot 关注到开发者在进行开发时,对于依赖版本的选择具有固定的搭配格式,并且这些依赖版本的选择还不能乱搭配。因此 SpringBoot 将所有的技术版本的常见使用方案都整理出来,制作出了最合理的依赖版本配置方案,这个技术搭配列表的名字叫做 parent
。
parent
自身具有多个版本,每个 parent
版本中包含有几百个其他技术的版本号,不同的 parent
间使用的各种技术的版本号有可能会发生变化。当开发者使用某些技术时,直接使用 SpringBoot 提供的 parent
就行了,由 parent
帮助开发者统一的进行各种技术的版本管理。
使用 parent 可以帮助开发者进行版本的统一管理。
2.2 Parent 的配置
SpringBoot 的 parent
配置信息定义在以下坐标中:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
</parent>
该坐标又继承了以下坐标:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.4</version>
</parent>
spring-boot-dependencies
中定义了两组信息:
- 依赖版本号属性: 定义了若干个技术的依赖版本号。
- 依赖坐标信息: 依赖坐标定义中没有具体的依赖版本号,而是引用了第一组信息中定义的依赖版本属性值。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
需要注意的是,上面的依赖坐标定义是出现在 <dependencyManagement>
标签中的,是对引用坐标的依赖管理,并不是实际使用的坐标。因此当你的项目中继承了这组 parent
信息后,在不使用对应坐标的情况下,前面的这组定义是不会具体导入某个依赖的。
2.3 Parent 的使用形式
因为在 Maven 中继承机会只有一次,上述继承的格式还可以切换成导入的形式进行。在阿里云的 starter 创建工程时就使用了此种形式:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.4 Parent 总结
- 开发 SpringBoot 程序要继承
spring-boot-starter-parent
。 spring-boot-starter-parent
中定义了若干个依赖管理。- 继承
parent
模块可以避免多个依赖使用相同技术时出现依赖版本冲突。 - 继承
parent
的形式也可以采用引入依赖的形式实现效果。
3. Starter
3.1 Starter 的作用
SpringBoot 关注到开发者在实际开发时,对于依赖坐标的使用往往都有一些固定的组合方式。对于这样的固定技术搭配,SpringBoot 给它起了个名字叫做 starter
。
starter
定义了使用某种技术时对于依赖的固定搭配格式,也是一种最佳解决方案。使用 starter 可以帮助开发者减少依赖配置。
3.2 Starter 的配置
在 SpringBoot 项目的 pom.xml
文件中,使用 SpringMVC 技术时,通常会添加一个名字中包含 starter 的依赖,例如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web
中又定义了若干个具体依赖的坐标,例如:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.5.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.5.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.9</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
<scope>compile</scope>
</dependency>
</dependencies>
3.3 Starter 与 Parent 的区别
- Starter: 是一个坐标中定义了若干个坐标,以前写多个的,现在写一个,是用来减少依赖配置的书写量的。
- Parent: 是定义了几百个依赖版本号,以前写依赖需要自己手工控制版本,现在由 SpringBoot 统一管理,这样就不存在版本冲突了,是用来减少依赖冲突的。
3.4 实际开发应用方式
- 实际开发中如果需要用什么技术,先去找有没有这个技术对应的 starter。
- 如果有对应的 starter,直接写 starter,而且无需指定版本,版本由 parent 提供。
- 如果没有对应的 starter,手写坐标即可。
- 实际开发中如果发现坐标出现了冲突现象,确认你要使用的可行的版本号,使用手工书写的方式添加对应依赖,覆盖 SpringBoot 提供给我们的配置管理。
- 方式一:直接写坐标。
- 方式二:覆盖
<properties>
中定义的版本号。
3.5 Starter 命名规则
SpringBoot 官方给出了多个 starter 的定义,以方便我们使用。名称大多为如下格式:
spring-boot-starter-技术名称
所以以后见了 spring-boot-starter-aaa
这样的名字,这就是 SpringBoot 官方给出的 starter 定义。
3.6 Starter 总结
- 开发 SpringBoot 程序需要导入坐标时通常导入对应的 starter。
- 每个不同的 starter 根据功能不同,通常包含多个依赖坐标。
- 使用 starter 可以实现快速配置的效果,达到简化配置的目的。
4. 引导类
SpringBoot 工程提供引导类用来启动程序。典型的引导类如下所示:
@SpringBootApplication
public class Springboot0101QuickstartApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot0101QuickstartApplication.class, args);
}
}
SpringBoot 工程启动后创建并初始化 Spring 容器。作为一个引导类最典型的特征就是当前类上方声明了一个注解 @SpringBootApplication
。
运行引导类的 main
方法会创建一个 Spring 容器对象,并且可以将这个对象保存起来,通过容器对象直接操作 Bean。
@SpringBootApplication
public class Springboot0101QuickstartApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Springboot0101QuickstartApplication.class, args);
BookController bean = ctx.getBean(BookController.class);
System.out.println("bean======>" + bean);
}
}
5. 内嵌 Tomcat
5.1 内嵌 Tomcat 的作用
内嵌 Tomcat 服务器是 SpringBoot 的辅助功能之一。SpringBoot 发现,既然要做 Web 程序,肯定离不开使用 Web 服务器,于是帮开发者搞一个 Web 服务器,你要愿意用的,直接使用就好了,干脆我再多给你几种选择,你随便切换。万一你不想用我给你提供的,也行,你可以自己搞。
5.2 内嵌 Tomcat 的定义位置
内嵌 Tomcat 的定义位于 spring-boot-starter-web
的 starter 中,具体依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.5.4</version>
</dependency>
打开查看该 starter 导入了哪些东西:
<dependencies>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.52</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>tomcat-annotations-api</artifactId>
<groupId>org.apache.tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>9.0.52</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>9.0.52</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>tomcat-annotations-api</artifactId>
<groupId>org.apache.tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
其中的核心坐标 tomcat-embed-core
负责将 Tomcat 功能引入到程序中。
5.3 内嵌 Tomcat 的运行原理
Tomcat 服务器是一款软件,而且是一款使用 Java 语言开发的软件,tomcat 运行起来也是对象。如果是对象,那 Spring 容器是用来管理对象的,这个对象可以交给 Spring 容器管理。因此 Tomcat 服务器运行其实是以对象的形式在 Spring 容器中运行的。
5.4 更换内嵌 Tomcat
SpringBoot 提供了 3 款内置的服务器:
- Tomcat (默认):Apache 出品,粉丝多,应用面广,负载了若干较重的组件。
- Jetty:更轻量级,负载性能远不及 Tomcat。
- Undertow:负载性能勉强跑赢 Tomcat。
使用其他服务器前先将 Tomcat 排除掉,因为 Tomcat 是默认加载的,再添加对应坐标即可。例如,将 Tomcat 更换为 Jetty 的配置如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
5.5 内嵌 Tomcat 总结
- 内嵌 Tomcat 服务器是 SpringBoot 辅助功能之一。
- 内嵌 Tomcat 工作原理是将 Tomcat 服务器作为对象运行,并将该对象交给 Spring 容器管理。
- 变更内嵌服务器思想是去除现有服务器,添加全新的服务器。