目录由此引入一个经典面试题两者的区别1. 核心理念与定位2. 配置方式3. 依赖管理与部署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-webSpringBoot会在后台自动配置好DispatcherServlet、默认的Error映射、Jackson用于JSON转换等一系列SpringMVC运行所需的组件。我们写的RestController、RequestMapping等注解依然是SpringMVC的注解。总结对比维度SpringMVCSpringBoot本质一个致力于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插件buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build起步依赖什么是起步依赖起步依赖Starter Dependencies本质上是一个特殊的Maven POM文件它聚合了特定功能所需的所有依赖库并进行了版本优化。你只需要在项目中引入这一个起步依赖就能获得开发某个功能所需的全部依赖。通俗类比还是用之前智能料理机的类比传统Maven做一道“鱼香肉丝”你需要自己去市场买肉、买木耳、买胡萝卜、买各种调料还要自己配比。起步依赖直接买一个“鱼香肉丝料理包”里面已经把所有的食材和调料按最佳比例配好了你只需要拆开包装下锅就行。具体例子spring-boot-starter-web当我们引入这一行实际上引入了什么这个起步依赖会自动传递引入以下依赖Spring框架核心spring-core、spring-context、spring-beans、spring-aopSpringMVC框架spring-web、spring-webmvc嵌入式Servlet容器默认引入tomcat-embed-core内嵌TomcatJSON转换工具jackson-databind用于处理JSON数据验证APIhibernate-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容器。1.管理Servlet生命周期2.实现HTTP协议3.多线程处理并发请求4.类加载与管理特性TomcatJettyUndertow出身Apache基金会Eclipse基金会JBossRed Hat特点稳定、成熟、市场占有率最高轻量、灵活、启动快高并发性能极佳、内存占用低适用场景绝大多数企业级应用嵌入式系统、开发调试高并发、IO密集型应用内存占用中等较低极低启动速度中等快快实例切换成jetty服务器dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId exclusions !-- 排除默认的Tomcat -- exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclusion /exclusions /dependency !-- 引入Jetty -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jetty/artifactId /dependencyyaml数据读取方式读取方式核心注解/类适用场景示例1. 单个值注入Value适合读取配置文件中某个单一的、简单的配置项比如服务器端口、单个业务参数等。Value(${server.port})private int serverPort;2. 批量绑定到JavaBeanConfigurationProperties当有一组相关配置项如数据库连接、Redis配置需要统一管理时这种方式非常高效。它会自动将YAML中指定前缀的配置映射到一个JavaBean的属性上。ConfigurationProperties(prefix spring.datasource)public class DataSourceProperties { ... }3. 编程式获取Environment接口在代码中需要动态获取配置或者不方便通过注解注入时使用。可以通过environment.getProperty(your.key)来获取。Autowiredprivate 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接口就可以开始进行数据库操作了完全不用自己写一行创建连接或配置工厂的代码。结语最后的最后感谢大家观看到最后如果对你有帮助请一键三连点赞关注拜托了收藏你的支持就是我最大的鼓励持续更新对你有帮助的知识