Spring Boo从“会用”到“精通”:Spring Boot 入门
Spring Boot 入门
一、是什么 —— Spring Boot 到底是什么?
1. 一句话定义
Spring Boot 是简化 Spring 应用开发的一个框架,是整个 Spring 技术栈的大整合,是简化 Spring 技术栈的快速开发脚手架。
它不是 Spring 的替代品,而是站在 Spring 巨人的肩膀上,帮你把"配置地狱"变成了"开箱即用"。
2. 用大白话理解
如果把 Spring 框架比作造一辆汽车:
- 传统 Spring:给你发动机、变速箱、轮胎、电路……所有零件散落一地,你需要自己看懂每一份装配图纸(XML 配置),亲手拧每一个螺丝(Bean 注册),稍有遗漏就抛异常。
- Spring Boot:给你一辆已经组装好、加满油、插上钥匙就能开的整车。你想换轮胎?拧下来换一个就行(自定义配置)。你想看油耗?仪表盘已经在了(Actuator 监控)。
核心哲学:约定大于配置(Convention over Configuration)
3. 从"闲聊"中提炼的核心认知
正如我在学习过程中不断深化的理解:
Spring Boot 的本质就是基于 Spring MVC 做了一些自动化的装配。从自动装配开始,到最后的 Actuator 原理解析。它的 Web 核心依然是 Spring MVC。
这就意味着:学 Spring Boot 不是学一个新框架,而是学 Spring 的"自动化配置版"。你学到的请求映射、参数解析、返回值处理这些底层原理,全部来自 Spring MVC。Spring Boot 只是帮你把这些东西自动装配好了。
二、为什么 —— 为什么要用 Spring Boot?
1. 传统 Spring 开发的痛点
| 痛点 | 具体表现 |
|---|---|
| 配置繁琐 | 一个 SSM 项目需要配置 web.xml、applicationContext.xml、spring-mvc.xml 等多个 XML 文件 |
| 依赖管理困难 | 引入一个功能需要同时引入 N 个依赖,版本冲突是家常便饭 |
| 部署复杂 | 需要安装 Tomcat,打 war 包,放到 webapps 下 |
| 重复劳动 | 每个项目都要写几乎一样的配置代码 |
2. Spring Boot 的解决方案
| 特性 | 解决什么问题 |
|---|---|
| 自动配置 | 不用写 XML,框架根据你的依赖自动配置组件 |
| 起步依赖(Starter) | 引入一个spring-boot-starter-web,Web 开发所有依赖自动到位 |
| 内嵌服务器 | 不用部署到外部 Tomcat,打 jar 包直接java -jar运行 |
| 监控端点(Actuator) | 生产级监控开箱即用,健康检查、指标收集一键搞定 |
三、怎么做 —— Spring Boot 入门实战
1. 环境准备
- JDK 8 或以上
- Maven 3.5+
- IDEA(推荐)
2. 创建第一个 Spring Boot 项目
方式一:手动改造 Maven 项目
(1)创建普通 Maven 项目,导入父项目依赖:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.6</version><relativePath/></parent>这个父项目的父项目是spring-boot-dependencies,它里面用<properties>标签定义了几乎所有常用依赖的版本号——这就是"自动版本仲裁"机制的来源。
(2)导入 Web 场景启动器:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>(3)添加打包插件:
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin>(4)编写主启动类:
// 源码位置:springboot2-master/boot-01-helloworld/src/main/java/com/atguigu/boot/MainApplication.java@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan("com.atguigu.boot")publicclassMainApplication{publicstaticvoidmain(String[]args){ConfigurableApplicationContextrun=SpringApplication.run(MainApplication.class,args);}}关键点:主启动类所在包 = 默认扫描根路径。所有子包下的@Controller、@Service、@Repository、@Component都会被自动扫描注册。
(5)编写 Controller:
// 源码位置:springboot2-master/boot-01-helloworld/src/main/java/com/atguigu/boot/controller/HelloController.java@ControllerpublicclassHelloController{@RequestMapping(path="/hello")@ResponseBodypublicStringsayhello(){return"Hello";}}(6)启动测试:运行main方法,访问http://localhost:8080/hello。
3. Spring Boot 核心特性详解
3.1 依赖管理
父项目依赖体系:
spring-boot-starter-parent (2.6.6) └── spring-boot-dependencies (2.6.6) └── <properties> 定义了所有依赖版本号修改默认版本号:
<properties><mysql.version>5.1.43</mysql.version><!-- 覆盖spring-boot-dependencies中的mysql版本 --></properties>Starter 机制:
spring-boot-starter-*:官方提供的场景启动器,引入即拥有该场景所有依赖*-spring-boot-starter:第三方提供的启动器- 所有 starter 最底层都依赖
spring-boot-starter(自动配置核心依赖)
3.2 自动配置(初体验)
这是 Spring Boot 最核心的能力。先留个印象,后续章节会深入源码:
- 自动配置 Tomcat:引入
spring-boot-starter-web时自动引入嵌入式的 Tomcat - 自动配置 Spring MVC:DispatcherServlet、ViewResolver、MessageConverter 等全套组件自动注册
- 自动配置 Web 常见功能:字符编码过滤器、文件上传解析器等
- 按需加载:虽然加载了 100+ 个自动配置类,但通过
@Conditional条件注解,只有满足条件的才会生效
3.3 容器功能
(1)@Configuration —— 声明配置类
@Configuration(proxyBeanMethods=true)// Full 模式,单例保证publicclassMyConfig{@BeanpublicUseruser01(){returnnewUser();}}- Full 模式(
proxyBeanMethods = true):通过 CGLIB 代理,保证@Bean方法返回的是容器中的单实例。配置类组件之间有依赖关系时使用。 - Lite 模式(
proxyBeanMethods = false):不走代理,每次调用都是新对象。配置类组件之间无依赖关系时使用,加速启动。
(2)@ComponentScan —— 指定包扫描路径
// 等价于 @SpringBootApplication@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan("com.atguigu.boot")(3)@Import —— 导入额外组件
给容器中自动创建指定类型的组件,默认组件名是全类名。
(4)@Conditional —— 条件装配
满足 Conditional 的某种条件时,才进行组件的注入。
常用条件注解:
| 注解 | 作用 |
|---|---|
@ConditionalOnClass | 类路径下存在指定 Class 时生效 |
@ConditionalOnMissingBean | 容器中不存在指定 Bean 时生效 |
@ConditionalOnProperty | 配置文件中有指定属性且值匹配时生效 |
@ConditionalOnBean | 容器中存在指定 Bean 时生效 |
3.4 配置绑定 —— @ConfigurationProperties
将配置文件中的值自动映射到 Java Bean 上。
方式一:@Component + @ConfigurationProperties
@Component@ConfigurationProperties(prefix="person")publicclassPerson{privateStringname;privateIntegerage;// getter/setter...}方式二:@EnableConfigurationProperties + @ConfigurationProperties
@Configuration@EnableConfigurationProperties(Car.class)// 开启 Car 的配置绑定,并自动注册到容器publicclassMyConfig{}@ConfigurationProperties(prefix="mycar")publicclassCar{privateStringbrand;privatedoubleprice;}配置文件和 Java Bean 的绑定链路:
application.properties → @ConfigurationProperties(prefix="xxx") → XxxProperties Bean → 注入到自动配置类四、Spring Boot 项目的标准目录结构
src/ ├── main/ │ ├── java/ # Java 源码 │ │ └── com/atguigu/boot/ │ │ ├── MainApplication.java # 主启动类(放在根包) │ │ ├── controller/ # 控制器 │ │ ├── service/ # 业务层 │ │ ├── config/ # 配置类 │ │ └── bean/ # 实体类 │ └── resources/ │ ├── static/ # 静态资源(js/css/images) │ ├── templates/ # 模板页面(Thymeleaf等) │ └── application.yml # 全局配置文件 └── test/ # 测试代码注意:static和templates这两个目录名是 Spring Boot约定好的,不是随便起的。后续静态资源原理章节会详细解释。
五、接下来学什么?
有了这个入门基础,接下来的学习路线就是顺着一个 HTTP 请求的生命周期,把 Spring Boot(底层 Spring MVC)的每一个核心机制拆开来看:
请求到达 ↓ 【01-自动装配】启动时已经把所有组件准备好了 ↓ 【02-静态资源】如果请求的是静态资源,直接返回 ↓ 【03-Rest风格】HiddenHttpMethodFilter 把 POST 转成 PUT/DELETE ↓ 【04-请求映射】DispatcherServlet → HandlerMapping 找到目标方法 ↓ 【05-参数解析】HandlerMethodArgumentResolver 遍历匹配,解析参数 ↓ 【06-Model/Map】共享的 BindingAwareModelMap 数据模型 ↓ 【07/08-参数绑定】WebDataBinder + Converter 完成类型转换和校验 ↓ 【09-Converter】分清三种 Converter 的作用时机 ↓ 【10-返回值处理】ReturnValueHandler 遍历匹配,处理返回值 ↓ 【11-内容协商】Accept 头 → 匹配 MediaType → HttpMessageConverter 写出 ↓ 响应返回这种将散落的知识点串联成线的思考方式,正是从"会用"走向"精通"的必经之路。
它本质上是一个分发路由 → 策略模式匹配 → 核心逻辑执行 → 策略模式输出的闭环。
