当前位置: 首页 > news >正文

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/ # 测试代码

注意statictemplates这两个目录名是 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 写出 ↓ 响应返回

这种将散落的知识点串联成线的思考方式,正是从"会用"走向"精通"的必经之路。
它本质上是一个分发路由 → 策略模式匹配 → 核心逻辑执行 → 策略模式输出的闭环。

http://www.zskr.cn/news/1463653.html

相关文章:

  • 别再只调API了!用Keras从零复现Facenet人脸识别模型(附完整代码与CASIA-WebFace数据集处理)
  • 期货量化 wait_update 超时怎么办:天勤 TqTimeoutError 分级处理
  • C++ 编码规范
  • 2026年大客户营销咨询选购指南,品牌排名 - mypinpai
  • PPTist:5分钟打造专业演示文稿的终极免费在线PPT制作工具
  • Mac窗口置顶神器Topit:如何让重要窗口永远在最前方
  • 紧急预警:标注数据漂移正 silently 毁掉你的模型效果!——用AI工具构建动态标注质量监控仪表盘(Python+Prometheus实战)
  • 2026年酒泉驾考驾校价格比较:新亿阳驾校性价比高吗? - mypinpai
  • 教育AI整合进入“深水区”:2024Q2行业报告显示,仅17%机构实现L1-L4能力跃迁——你的团队处在哪一级?
  • AI内容工作流会成为品牌基础设施
  • 量化程序如何同时支持回测、模拟盘和实盘
  • 避坑指南:MATLAB读取MDF和BLF文件时,你可能会遇到的5个常见错误及解决方法
  • 5个实用技巧:用marked.js打造高效Markdown处理方案
  • 别再只盯着CCF了!手把手教你用CORE Ranking和CCF中文期刊目录,精准定位你的投稿目标
  • 训练Mask-RCNN时,那个神秘的events文件怎么用TensorBoard打开看损失曲线?
  • Moneta Markets亿汇:“量子芯片点燃科技预期”
  • 如何免费实现游戏控制器虚拟化:ViGEmBus驱动完整指南
  • 手把手教你用STM32F072C8T6自制一个带串口的J-Link OB(附全套资料)
  • 为什么有些影视网站越用越顺手?一次实际体验后的分析
  • MatAnyone:一键实现专业级视频抠图的终极解决方案
  • 2026年现阶段,四川优质水果基地如何选?这份深度指南为您解析 - 2026年企业资讯
  • Aegisub字幕编辑高效解决方案:4大使用场景的完整技术指南
  • POP3协议抓包实战:从Wireshark过滤器技巧到常见认证失败排查
  • 3分钟掌握Windows窗口置顶技巧:告别频繁切换,工作效率提升50%
  • 终极指南:3分钟用BetterNCM Installer让网易云音乐焕然一新
  • 夹克制作全流程科普:工艺标准、自动化改造与设备科学选型
  • VTJ.PRO 双版本升级:构建企业级 AI 低代码协同开发新范式
  • NVIDIA Profile Inspector深度解析:显卡性能调优实战指南
  • 088、文字检测 YOLO 风格:用 YOLO 做场景文字检测替代 DBNet 的实验
  • 别再只用Measure Inertia了!用CATIA VBA脚本一键生成零件最小材料包络盒(附完整代码)