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 项目,导入父项目依赖:

xml 复制代码
<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 场景启动器:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

(3)添加打包插件:

xml 复制代码
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

(4)编写主启动类:

java 复制代码
// 源码位置:springboot2-master/boot-01-helloworld/src/main/java/com/atguigu/boot/MainApplication.java
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
public class MainApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
    }
}

关键点 :主启动类所在包 = 默认扫描根路径。所有子包下的 @Controller@Service@Repository@Component 都会被自动扫描注册。

(5)编写 Controller:

java 复制代码
// 源码位置:springboot2-master/boot-01-helloworld/src/main/java/com/atguigu/boot/controller/HelloController.java
@Controller
public class HelloController {
    @RequestMapping(path = "/hello")
    @ResponseBody
    public String sayhello() {
        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> 定义了所有依赖版本号

修改默认版本号

xml 复制代码
<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 ------ 声明配置类

java 复制代码
@Configuration(proxyBeanMethods = true)  // Full 模式,单例保证
public class MyConfig {
    @Bean
    public User user01() {
        return new User();
    }
}
  • Full 模式proxyBeanMethods = true):通过 CGLIB 代理,保证 @Bean 方法返回的是容器中的单实例。配置类组件之间有依赖关系时使用
  • Lite 模式proxyBeanMethods = false):不走代理,每次调用都是新对象。配置类组件之间无依赖关系时使用,加速启动。

(2)@ComponentScan ------ 指定包扫描路径

java 复制代码
// 等价于 @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

java 复制代码
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    // getter/setter...
}

方式二:@EnableConfigurationProperties + @ConfigurationProperties

java 复制代码
@Configuration
@EnableConfigurationProperties(Car.class)  // 开启 Car 的配置绑定,并自动注册到容器
public class MyConfig {}
java 复制代码
@ConfigurationProperties(prefix = "mycar")
public class Car {
    private String brand;
    private double price;
}

配置文件和 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 写出
    ↓
响应返回

这种将散落的知识点串联成线的思考方式,正是从"会用"走向"精通"的必经之路。

它本质上是一个 分发路由 → 策略模式匹配 → 核心逻辑执行 → 策略模式输出 的闭环。

相关推荐
无风听海1 小时前
深入解析 ASP.NET Core 中的 Request.Cookies:从 HTTP 协议到加密存储与执行时序
后端·http·asp.net
染翰1 小时前
Java 实现 Git 自动克隆工具,打包成 Windows 独立 EXE(免安装JDK)
java·git·后端
七老板的blog1 小时前
多阶段 AI 评测流水线架构设计与实践
java·人工智能·spring
程序员cxuan1 小时前
Codex 一直 Reconnecting?我最后发现,常见就两个坑
人工智能·后端·程序员
qq_458148201 小时前
科大讯飞实时语音识别(rtasr)真实项目踩坑经验总结与手把手教学真实可运行Demo
java·开发语言·websocket·语音识别
创业之路&下一个五年1 小时前
mvvm中v和vm关系,vm中v和m的关系?
java·开发语言·javascript
阿昌喜欢吃黄桃1 小时前
Java优质开源AI项目
java·ai·langchain·开源·rag·springai·langchain4j
程序员海军2 小时前
沪漂五周年了:我越来越迷茫了
前端·人工智能·后端
biubiubiu07062 小时前
SpringBoot3.5.4 AOP环绕通知使用
java·spring boot