当前位置: 首页 > 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.jsqmd.com/news/952037/

相关文章:

  • 毕设可用的中文电影对话问答系统:PyTorch版Seq2Seq+Luong注意力实现
  • AI工具如何72小时内重构对账流程?揭秘头部金融机构已验证的4层智能校验架构
  • MATLAB一键运行的音频水印工具包:支持DWT-DCT-SVD嵌入提取、多音频测试与图像水印可视化评估
  • 2026年新发布:广东钢板网工厂联系指南与市场趋势解析 - 2026年企业资讯
  • 泰坦尼克号生存预测三模型实战包:逻辑回归+ID3决策树+随机森林Python完整实现
  • 别再只调API了!用Keras从零复现Facenet人脸识别模型(附完整代码与CASIA-WebFace数据集处理)
  • 期货量化 wait_update 超时怎么办:天勤 TqTimeoutError 分级处理
  • 避坑指南:STM32低功耗停止模式唤醒后时钟配置的那些事儿
  • 列车轮对几何参数在线检测关键技术解析【附数据】
  • C++ 编码规范
  • 2026年大客户营销咨询选购指南,品牌排名 - mypinpai
  • 别再死记硬背!一张图+一个故事帮你理清正交、酉、正规矩阵的关系与区别
  • Zotero PDF预览插件:让文献浏览告别窗口切换的困扰
  • Transformer QKV 计算瓶颈?一次关于长上下文显存爆炸的硬核排查与优化
  • AI简历不是“加个ChatGPT”,而是重构求职链路——12个企业级落地案例拆解
  • 2026年深圳全屋定制一站式服务避坑 别被假工厂全流程忽悠了 - 产品测评官
  • 智能担保系统架构设计全图解(含LLM+规则引擎双模决策链路)
  • 别再死记硬背了!用Multisim/PSpice仿真带你直观理解PFC的三种工作模式(CCM/DCM/CrM)
  • PPTist:5分钟打造专业演示文稿的终极免费在线PPT制作工具
  • Mac窗口置顶神器Topit:如何让重要窗口永远在最前方
  • 紧急预警:标注数据漂移正 silently 毁掉你的模型效果!——用AI工具构建动态标注质量监控仪表盘(Python+Prometheus实战)
  • CentOS 7生产环境PHP 8.1安装避坑实录:Remi源、扩展冲突与SELinux策略
  • ov5647摄像头模块、MIPI的MCLK主时钟
  • 2026年酒泉驾考驾校价格比较:新亿阳驾校性价比高吗? - mypinpai
  • 从开关电源到第三代半导体:聊聊PFC技术这几十年的‘进化史’
  • Python 爬虫进阶技巧:自定义请求头编码适配多国语言网页爬取
  • 3步掌握iOS虚拟定位:iFakeLocation完全指南
  • 教育AI整合进入“深水区”:2024Q2行业报告显示,仅17%机构实现L1-L4能力跃迁——你的团队处在哪一级?
  • 2026运城市权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • 你的 AI 编程工具,每次请求都在干嘛?这个开源项目帮你分析得明明白白