SpringBoot vs SpringMVC:以及SpringBoot的全流程开发(1)

目录

由此引入一个经典面试题:两者的区别

[1. 核心理念与定位](#1. 核心理念与定位)

[2. 配置方式](#2. 配置方式)

[3. 依赖管理与部署](#3. 依赖管理与部署)

[4. 底层关系](#4. 底层关系)

通俗类比

SpringBoot的入门程序

SpringBoot的快速启动:

起步依赖:

具体例子:spring-boot-starter-web

起步依赖的核心优势

工作原理

web服务器的切换:

yaml数据读取方式:

SpringBoot是如何让yaml生效的:


前言:我们通过前面对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-corespring-contextspring-beansspring-aop |
| SpringMVC框架spring-webspring-webmvc |
| 嵌入式Servlet容器 :默认引入tomcat-embed-core(内嵌Tomcat) |
| JSON转换工具jackson-databind(用于处理JSON数据) |
| 验证APIhibernate-validator(用于数据校验) |
| 日志框架spring-boot-starter-logging(默认使用Logback) |

如果没有起步依赖,我们需要在pom.xml里手动添加至少10个以上的依赖,并且要确保它们的版本互相兼容。而起步依赖把这几十行配置简化成了一行。

起步依赖的核心优势

  1. 简化依赖管理

    • 你不需要记住某个功能需要哪些具体依赖,只需要知道对应的starter是什么。

    • 例如,想做WebSocket通信,就用spring-boot-starter-websocket

  2. 版本兼容性保证

    • 起步依赖中的各个库版本都经过Spring Boot团队的严格测试,确保它们之间可以协同工作。

    • 你再也不用担心遇到"ClassNotFoundException"或"MethodNotFoundException"这类版本冲突问题。

  3. 传递性依赖自动处理

    • 起步依赖会自动引入其所需的所有下层依赖,我们不需要手动添加。

    • 例如,spring-boot-starter-web会自动引入Jackson库,让你可以直接在Controller中返回Java对象,框架会自动将其转为JSON。

  4. 可定制性

    • 起步依赖并不是"黑盒子"。如果你需要特定版本的某个库,可以在pom.xml中明确指定版本号,覆盖starter的默认配置。

    • 我们也可以排除某些不需要的传递性依赖

工作原理

Spring Boot的起步依赖之所以能够工作,是因为每个starter都遵循了以下设计原则:

  • 聚合而非继承:starter只是对依赖的聚合,并不是定义了一个新的"超级依赖"。

  • 版本中心化 :所有的版本号统一由spring-boot-dependencies这个父POM管理(也就是我们的项目继承的spring-boot-starter-parent)。

  • 可选依赖最小化:starter尽可能只包含必需的依赖,非必需的依赖设计为可选的,需要时由开发者手动引入。

web服务器的切换:

我们熟悉的TomcatJetty就是web服务器,也可以叫做 Servlet容器。

  1. 管理Servlet生命周期

  2. 实现HTTP协议

  3. 多线程处理并发请求

  4. 类加载与管理

特性 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生效的:

这背后是一个精密的**"自动配置"**过程:

  1. 读取与绑定 :Spring Boot启动时,会读取application.yml文件。

  2. 创建数据源 (DataSource)spring.datasource下的配置会被绑定到DataSourceProperties 这个Bean上。接着,Spring Boot的自动配置机制(DataSourceAutoConfiguration)会读取这个Bean的信息,自动创建一个数据源对象(比如默认的HikariCP连接池)。

  3. 创建MyBatis核心 (SqlSessionFactory) :有了数据源还不够,MyBatis需要自己的"工作引擎",也就是SqlSessionFactory。这时,MyBatis的自动配置类**(MybatisAutoConfiguration)** 会登场。它会自动拿到上一步创建的数据源,并结合你在mybatis下的配置(如mapper-locations),为你创建好SqlSessionFactory。

  4. 拿来就用 :经过以上步骤,一个MyBatis环境就准备就绪了。你只需要在代码里直接注入Mapper接口,就可以开始进行数据库操作了,完全不用自己写一行创建连接或配置工厂的代码。

结语:

最后的最后,感谢大家观看到最后,如果对你有帮助,请**一键三连,点赞,关注(拜托了),收藏,**你的支持就是我最大的鼓励,持续更新对你有帮助的知识!

相关推荐
百锦再1 小时前
Java Map常用方法和实现类深度详解
java·开发语言·spring boot·struts·kafka·tomcat·maven
_codemonster2 小时前
JavaWeb开发系列(九)idea配置jdbc
java·ide·intellij-idea
Hx_Ma162 小时前
测试题(六)
java·tomcat·mybatis
码云数智-大飞2 小时前
.NET 10 & C# 14 新特性详解:扩展成员 (Extension Members) 全面指南
java·数据库·算法
Anastasiozzzz2 小时前
阿亮随手录-SpringBoot启动流程、三级缓存要求、BeanFactory与FactoryBean、AutoWired与Resource、不推荐字段注入
java·spring
独自破碎E2 小时前
BISHI61 小q的数列
java·开发语言
计算机毕设VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue连锁门店管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
Dylan的码园2 小时前
从软件工程师看计算机是如何工作的
java·jvm·windows·java-ee
callJJ2 小时前
Spring AI Tool Calling(工具调用)详解——让大模型拥有“动手能力“
java·人工智能·spring·spring ai·tool calling