Spring Boot 核心理念与快速上手

Spring Boot 核心理念与快速上手

定位:01篇,讲透 Boot 解决的痛点、三大核心理念、最小应用搭建、@SpringBootApplication 的分解与工程结构

适用版本:Spring Boot 3.x(JDK 17+)


目录


一、Boot 解决的问题

Spring Framework 强大但"重",长期存在四大痛点:

痛点 表现
配置繁琐 XML 或注解样板配置量大,每接一个组件一堆配置
依赖管理 版本冲突需手动协调,"依赖地狱"常见
部署复杂 传统要打 war 部署到外部 Tomcat
整合成本高 接入数据源、缓存、MQ 各自一套配置

Boot 的定位不是"新的框架",而是让 Spring 开箱即用的脚手架 + 默认约定,底层仍是 Spring Framework。


二、核心理念

三大支柱支撑"约定大于配置":

2.1 自动配置(Auto-Configuration)

按 classpath 依赖和已有 Bean,智能推断并装配默认 Bean。引入 spring-boot-starter-web 就自动配好 DispatcherServlet、内嵌 Tomcat、JSON 转换------你什么都不写也能跑。原理深讲在 02篇。

2.2 起步依赖(Starter)

一个坐标引入一组版本协调的依赖:

复制代码
spring-boot-starter-web
   └── 内含 Spring MVC、内嵌 Tomcat、Jackson、校验等,版本由 Boot 统一仲裁

价值:不操心版本兼容;依赖树由 Boot 的依赖管理(BOM)保证一致。

2.3 内嵌容器 + 可执行 jar

把 Servlet 容器(Tomcat/Undertow)打进 jar ,java -jar app.jar 直接运行,契合容器化部署(Docker 里一个进程一个应用)。


三、快速上手

最小 Web 应用:

xml 复制代码
<!-- pom.xml 关键依赖 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.x.x</version>
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
java 复制代码
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

@RestController
class HelloController {
    @GetMapping("/hello")
    String hello() { return "Hello, Spring Boot"; }
}

运行 main():内嵌 Tomcat 启动、监听 8080、/hello 可访问------没有任何 XML、没有外部容器。


四、@SpringBootApplication 分解

这是最高频的考点,它是一个组合注解:

复制代码
@SpringBootApplication
├── @SpringBootConfiguration   → 本质 @Configuration,标记这是配置类
├── @EnableAutoConfiguration   → 开启自动配置(BT-02 核心)
└── @ComponentScan             → 扫描【启动类所在包及子包】

两个推论:

  1. 启动类位置决定扫描范围:启动类应放在根包,业务类在其子包,否则 @Component 扫不到(常见"Bean 没注册"根因);
  2. 三个能力可拆开单独定制:如 @ComponentScan(basePackages=...) 改扫描范围。

五、工程结构与多环境

5.1 标准布局

复制代码
src/main/java
  └── com.example.app
       ├── App.java                  ← 启动类(根包)
       ├── controller/ service/ repository/
src/main/resources
  ├── application.yml               ← 主配置
  ├── application-dev.yml 等        ← 环境配置
  ├── static/                       ← 静态资源
  └── templates/                    ← 模板

打包:spring-boot-maven-plugin 生成可执行 fat jar(含所有依赖与内嵌容器)。

5.2 多环境

profile:application-{profile}.yml + 激活(spring.profiles.active / 环境变量)。典型:dev(本地)/ test / prod,差异收敛在配置文件,不进业务代码。


六、总结

  1. 定位:Boot 是 Spring 的开箱即用脚手架,不是新框架;解决配置繁琐、依赖冲突、部署复杂、整合成本高四大痛点。
  2. 三大支柱:自动配置(按依赖智能装配)、起步依赖(版本协调)、内嵌容器(java -jar 直跑)。
  3. 最小应用:starter-web + @SpringBootApplication + 一个 Controller,main() 即起。
  4. 组合注解:@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan;启动类位置决定扫描范围。
  5. 工程结构:启动类在根包,配置按 profile 分,打成可执行 fat jar。

七、常见高频面试题

1. Spring Boot 和 Spring 的关系?Boot 解决了什么问题?

要点:Boot 不是新框架,是构建在 Spring Framework 之上的脚手架,提供开箱即用能力。解决四大痛点:配置繁琐(样板多)、依赖管理(版本冲突)、部署复杂(需外部容器)、整合成本高(每组件一套配置)。底层机制仍是 Spring 的 IoC/AOP/事务,Boot 通过自动配置、起步依赖、内嵌容器把这些默认化、约定化。

2. Spring Boot 的核心理念(三大支柱)是什么?

要点:① 自动配置------按 classpath 依赖和已有 Bean 智能推断装配默认组件,约定大于配置;② 起步依赖(Starter)------一个坐标引入一组版本协调的依赖,配合 Boot BOM 统一仲裁版本,避免依赖地狱;③ 内嵌容器 + 可执行 jar------Servlet 容器打进 jar,java -jar 直接运行,契合容器化部署。三者共同实现"最少配置快速启动"。

3. @SpringBootApplication 包含哪些注解?各自作用?

要点:组合注解,含三个------@SpringBootConfiguration(本质 @Configuration,标记配置类)、@EnableAutoConfiguration(开启自动配置,触发加载候选配置类)、@ComponentScan(扫描启动类所在包及子包注册组件)。推论:启动类必须放根包,否则业务组件扫不到;需要定制时可拆开单独使用(如指定 basePackages)。

4. 为什么启动类的位置很重要?

要点:@SpringBootApplication 内置的 @ComponentScan 默认扫描启动类所在包及其子包。若启动类放错位置(如在某个子包),其它包下的 @Component/@Service/@Controller 扫描不到,表现为"Bean 未注册/找不到依赖"。规范是启动类放应用根包,业务代码组织在其子包下;确需扫描其它路径时显式配置 basePackages。

5. 什么是 Starter?有什么好处?

要点:Starter 是一组相关依赖的聚合坐标(如 spring-boot-starter-web 含 MVC、内嵌 Tomcat、Jackson、校验),引入一个即可获得整套能力。好处:① 版本协调------由 Boot 依赖管理(BOM/parent)统一仲裁,避免冲突;② 简化声明------不用逐个找依赖和版本;③ 语义清晰------按能力命名。官方提供大量 starter,也可自定义(BT-03)。

6. Spring Boot 如何实现"不需要外部 Tomcat"?

要点:内嵌容器机制。starter-web 引入内嵌 Tomcat(或可选 Undertow)依赖,Boot 自动配置在应用启动时创建并启动内嵌 Servlet 容器,把 Spring MVC 的 DispatcherServlet 注册进去。打包为可执行 jar 后 java -jar 直接运行。这改变了"应用部署进容器"的传统模型,变为"容器随应用走",契合 Docker/微服务。

7. fat jar 是什么?如何生成的?

要点:可执行 fat(uber)jar 把应用类、所有依赖、内嵌容器打成一个 jar,用 java -jar 直接运行。由 spring-boot-maven-plugin(或 Gradle 插件)的 repackage 目标生成:在标准 jar 基础上按 Boot 特定布局重组(依赖放 BOOT-INF/lib,应用类放 BOOT-INF/classes,加自定义 Manifest 指定启动类与 Boot 启动器)。这种布局由专门的 JarLauncher 加载。

8. Spring Boot 如何做依赖版本管理?

要点:两种主要方式。① 继承 spring-boot-starter-parent:获得默认配置、插件管理与依赖仲裁;② 不继承时用 import spring-boot-dependencies(BOM),只获得版本仲裁不引入父 POM 的默认。两者都由 Boot 预先测试过一组协调版本,显式指定版本可覆盖。这避免了多依赖版本冲突的"依赖地狱"。

9. 多环境配置怎么管理?

要点:利用 profile。主配置 application.yml + 环境专属 application-{profile}.yml(如 dev/test/prod),通过 spring.profiles.active(配置文件/环境变量/JVM -D)激活,环境专属值覆盖主配置。差异收敛在配置文件,不进业务代码;敏感配置(密码/密钥)不入库,走环境变量或配置中心。生产激活入口收敛到部署系统。

10. 一个 @RestController 从启动到能响应请求,经历了什么?

要点:main() 运行 SpringApplication.run → 创建 ApplicationContext 并刷新(refresh)→ 组件扫描发现 @RestController 注册为 Bean → 自动配置装配内嵌 Tomcat 与 DispatcherServlet → 注册 HandlerMapping(把 URL 映射到 @GetMapping 方法)→ 容器启动监听端口。请求到来时 DispatcherServlet 路由到对应方法,返回值经消息转换器(Jackson)序列化为 JSON 响应。

相关推荐
省钱兄--zs1 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
小蒜学长10 小时前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
ym hyd 11112 小时前
门诊挂号系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
萧瑟余晖13 小时前
Spring Boot 自动配置原理详解
spring boot
知守观13 小时前
Spring Boot 2.1 → 3.5 迁移推演:这个 2018 年的项目会炸在哪
java·spring boot
LiuYanG13 小时前
MQTT 客户端反复重连怎么办?Spring Boot 接 EMQX 断线重连踩坑实录
spring boot·物联网
Q264336502314 小时前
【有源码】基于SpringBoot+Vue的博物馆展览与服务一体化平台-java博物馆数字化展品展示与交互平台设计
java·vue.js·spring boot·spring·毕业设计·javaweb·课程设计
专业程序开发源14 小时前
springboot全民健身和饮食健康管理系统29158-计算机课程设计、毕业设计
java·spring boot·后端·python·django·php·课程设计
ym hyd 11115 小时前
汽车零部件缺陷管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·汽车·毕设