目录
[1. 核心理念与定位](#1. 核心理念与定位)
[2. 配置方式](#2. 配置方式)
[3. 依赖管理与部署](#3. 依赖管理与部署)
[4. 底层关系](#4. 底层关系)
前言:我们通过前面对SPringMVC的学习,体会到了Spring框架的使用,不过显得较为繁琐,由此Spring家族又推出了更为简便的框架-------SpringBoot。
由此引入一个经典面试题:两者的区别
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #### 1. 核心理念与定位 SpringMVC :是一个Web框架。它提供了Controller(控制器)、ViewResolver(视图解析器)等组件,专门用来开发Web应用程序的表示层(MVC中的V和C)。它是Spring框架的一部分,需要依赖Spring的核心容器才能运行。 SpringBoot :是一个微框架 / 脚手架 。它的核心理念是"约定大于配置 "。它本身不提供Spring的核心功能,而是整合了Spring技术栈(包括SpringMVC、Spring Data等)以及其他第三方库,并提供了自动配置,让你能极快地创建一个生产级的Spring应用。 |
| #### 2. 配置方式 这是两者最直观的区别: * SpringMVC :配置繁琐。在一个传统的SpringMVC项目中,你需要配置 web.xml、配置Spring的配置文件、配置视图解析器、配置包扫描、配置DispatcherServlet,还需要手动引入大量的依赖(并且要担心版本兼容性)。一个空白项目启动,往往需要花费不少时间在配置上。 * 例子: 为了搭建一个简单的REST API,你可能需要写几十行甚至上百行的XML配置或Java Config。 * SpringBoot :零配置起步。它通过起步依赖和自动配置,将绝大部分配置都简化了。 * 例子: 同样的REST API,只需要在 pom.xml 中加入 spring-boot-starter-web 依赖,然后在主类上写上 @SpringBootApplication 注解,运行 main 方法,一个Web应用就启动了。你只需要关注写 @RestController,完全不用管DispatcherServlet是怎么注册的。 |
| #### 3. 依赖管理与部署 * SpringMVC :依赖需手动指定 。你需要自己定义每个依赖的版本号,并确保它们兼容。打包时通常打成 WAR包,然后部署到外部的Tomcat、Jetty等服务器上。 * SpringBoot :起步依赖(Starter POMs) 。比如 spring-boot-starter-web 会帮你把SpringMVC、Jackson、Tomcat等一系列相关依赖都拉下来,且版本经过测试,完全兼容。打包时通常打成 JAR包 (内含Tomcat),通过 java -jar 命令直接运行,非常方便微服务架构下的部署。 |
| #### 4. 底层关系 实际上,SpringBoot内部默认使用的Web框架就是SpringMVC。 * 当你在SpringBoot项目中引入了 spring-boot-starter-web,SpringBoot会在后台自动配置好DispatcherServlet、默认的Error映射、Jackson(用于JSON转换)等一系列SpringMVC运行所需的组件。 * 我们写的 @RestController、@RequestMapping 等注解,依然是SpringMVC的注解。 |
总结对比:
|----|-----------------------|---------------------------------|
| 维度 | SpringMVC | SpringBoot |
| 本质 | 一个致力于web开发的框架 | 一个致力于快速开发的微框架/整合工具 |
| 关系 | 是Spring生态的一部分 | 内部默认使用SpringMVC作为Web层解决方案 |
| 配置 | 配置繁琐,需要手动定义 | 自动配置,开箱即用,简化配置 |
| 依赖 | 需**手动引入依赖,**管理版本 | 起步依赖,一站引入,版本由SpringBoot统一管理 |
| 部署 | 打WAR包,部署到外部Servlet容器中 | 打JAR包,内嵌Servlet容器(如Tomcat),独立运行 |
| 目标 | 提高web层的开发效率 | 提高整个Spring项目的初始化搭建和运行效率 |
通俗类比
-
SpringMVC 像是给我们一套预制菜材料(蔬菜、肉、调料)和一本菜谱。我们可以做出美味的菜,但需要自己切菜、配菜,并严格按照菜谱操作。
-
SpringBoot 像是一台智能料理机。它里面已经内置了各种菜谱(自动配置),我们只需要选择"鱼香肉丝"模式(选择
starter),把对应的菜放进去(写我们的业务代码),机器就自动帮你把火候、时间、调料都搞定,很快就能上菜。而且,这台机器还自带加热装置(内嵌服务器),不用再去买燃气灶(外置Tomcat)。
SpringBoot的入门程序
1.创建新模块,选择Spring初始化并配置模块相关基础信息。
2.选择当前模块需要使用的技术集
3.开发控制器类
4.运行自动生成的Application类
SpringBoot的快速启动:
执行maven生命周期中的打包
执行启动指令
java -jar springboot.jar
注意事项
jar支持命令行启动需要依赖maven插件支持,请确认打包时是否具有SpringBoot对应的maven插件
<build>
<plugins>
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin>
</plugins>
</build>
起步依赖:
什么是起步依赖?
起步依赖(Starter Dependencies)本质上是一个特殊的Maven POM文件,它聚合了特定功能所需的所有依赖库,并进行了版本优化。你只需要在项目中引入这一个起步依赖,就能获得开发某个功能所需的全部依赖。
通俗类比
还是用之前智能料理机的类比:
-
传统Maven:做一道"鱼香肉丝",你需要自己去市场买肉、买木耳、买胡萝卜、买各种调料,还要自己配比。
-
起步依赖:直接买一个"鱼香肉丝料理包",里面已经把所有的食材和调料按最佳比例配好了,你只需要拆开包装下锅就行。
具体例子:spring-boot-starter-web
当我们引入这一行,实际上引入了什么
这个起步依赖会自动传递引入以下依赖:
|----------------------------------------------------------------------------|
| Spring框架核心 :spring-core、spring-context、spring-beans、spring-aop |
| SpringMVC框架 :spring-web、spring-webmvc |
| 嵌入式Servlet容器 :默认引入tomcat-embed-core(内嵌Tomcat) |
| JSON转换工具 :jackson-databind(用于处理JSON数据) |
| 验证API :hibernate-validator(用于数据校验) |
| 日志框架 :spring-boot-starter-logging(默认使用Logback) |
如果没有起步依赖,我们需要在pom.xml里手动添加至少10个以上的依赖,并且要确保它们的版本互相兼容。而起步依赖把这几十行配置简化成了一行。
起步依赖的核心优势
-
简化依赖管理
-
你不需要记住某个功能需要哪些具体依赖,只需要知道对应的starter是什么。
-
例如,想做WebSocket通信,就用
spring-boot-starter-websocket。
-
-
版本兼容性保证
-
起步依赖中的各个库版本都经过Spring Boot团队的严格测试,确保它们之间可以协同工作。
-
你再也不用担心遇到"ClassNotFoundException"或"MethodNotFoundException"这类版本冲突问题。
-
-
传递性依赖自动处理
-
起步依赖会自动引入其所需的所有下层依赖,我们不需要手动添加。
-
例如,
spring-boot-starter-web会自动引入Jackson库,让你可以直接在Controller中返回Java对象,框架会自动将其转为JSON。
-
-
可定制性
-
起步依赖并不是"黑盒子"。如果你需要特定版本的某个库,可以在
pom.xml中明确指定版本号,覆盖starter的默认配置。 -
我们也可以排除某些不需要的传递性依赖
-
工作原理
Spring Boot的起步依赖之所以能够工作,是因为每个starter都遵循了以下设计原则:
-
聚合而非继承:starter只是对依赖的聚合,并不是定义了一个新的"超级依赖"。
-
版本中心化 :所有的版本号统一由
spring-boot-dependencies这个父POM管理(也就是我们的项目继承的spring-boot-starter-parent)。 -
可选依赖最小化:starter尽可能只包含必需的依赖,非必需的依赖设计为可选的,需要时由开发者手动引入。
web服务器的切换:
我们熟悉的Tomcat 和Jetty就是web服务器,也可以叫做 Servlet容器。
-
管理Servlet生命周期
-
实现HTTP协议
-
多线程处理并发请求
-
类加载与管理
| 特性 | Tomcat | Jetty | Undertow |
|---|---|---|---|
| 出身 | Apache基金会 | Eclipse基金会 | JBoss(Red Hat) |
| 特点 | 稳定、成熟、市场占有率最高 | 轻量、灵活、启动快 | 高并发性能极佳、内存占用低 |
| 适用场景 | 绝大多数企业级应用 | 嵌入式系统、开发调试 | 高并发、IO密集型应用 |
| 内存占用 | 中等 | 较低 | 极低 |
| 启动速度 | 中等 | 快 | 快 |
实例:切换成jetty服务器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 排除默认的Tomcat -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入Jetty -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
yaml数据读取方式:
| 读取方式 | 核心注解/类 | 适用场景 | 示例 |
|---|---|---|---|
| 1. 单个值注入 | @Value |
适合读取配置文件中某个单一的、简单的配置项,比如服务器端口、单个业务参数等。 | @Value("${server.port}") private int serverPort; |
| 2. 批量绑定到JavaBean | @ConfigurationProperties |
当有一组相关配置项(如数据库连接、Redis配置)需要统一管理时,这种方式非常高效。它会自动将YAML中指定前缀的配置映射到一个JavaBean的属性上。 | @ConfigurationProperties(prefix = "spring.datasource") public class DataSourceProperties { ... } |
| 3. 编程式获取 | Environment 接口 |
在代码中需要动态获取配置,或者不方便通过注解注入时使用。可以通过environment.getProperty("your.key")来获取。 |
@Autowired private Environment env; String url = env.getProperty("spring.datasource.url"); |
SpringBoot是如何让yaml生效的:
这背后是一个精密的**"自动配置"**过程:
-
读取与绑定 :Spring Boot启动时,会读取
application.yml文件。 -
创建数据源 (
DataSource) :spring.datasource下的配置会被绑定到DataSourceProperties 这个Bean上。接着,Spring Boot的自动配置机制(DataSourceAutoConfiguration)会读取这个Bean的信息,自动创建一个数据源对象(比如默认的HikariCP连接池)。 -
创建MyBatis核心 (
SqlSessionFactory) :有了数据源还不够,MyBatis需要自己的"工作引擎",也就是SqlSessionFactory。这时,MyBatis的自动配置类**(MybatisAutoConfiguration)** 会登场。它会自动拿到上一步创建的数据源,并结合你在mybatis下的配置(如mapper-locations),为你创建好SqlSessionFactory。 -
拿来就用 :经过以上步骤,一个MyBatis环境就准备就绪了。你只需要在代码里直接注入Mapper接口,就可以开始进行数据库操作了,完全不用自己写一行创建连接或配置工厂的代码。
结语:
最后的最后,感谢大家观看到最后,如果对你有帮助,请**一键三连,点赞,关注(拜托了),收藏,**你的支持就是我最大的鼓励,持续更新对你有帮助的知识!
