一句话定位:Spring Boot 是构建在 Spring Framework 5.x 之上的快速开发增强层,通过自动配置、起步依赖和内嵌容器三大能力,让 Java 企业级应用实现"开箱即用、一键运行"。
定义与作用
Spring Boot 是基于 Spring Framework 的快速应用开发框架,遵循"约定优于配置(Convention over Configuration)"理念,通过自动配置、起步依赖(Starter)和嵌入式服务器三大核心能力,将开发者从繁琐的 XML 配置和服务器部署中解放出来,实现"just run"的开发体验。
它解决的痛点:
| 痛点 | 传统SSM开发 | Spring Boot 方案 |
|---|---|---|
| 配置繁琐 | 手写 applicationContext.xml、spring-mvc.xml、mybatis-config.xml 等数十个配置文件 | 自动配置,只需 application.yml 覆盖关键项 |
| 依赖冲突 | 手动管理 Spring 5.x、MyBatis、Jackson、Servlet 等版本,易出现 ClassNotFoundException | Starter 统一管理兼容版本,引入一个Starter即获全套依赖 |
| 服务器部署 | 打包 WAR 文件,部署到外部 Tomcat,调整 server.xml | 内嵌 Tomcat,直接 java -jar 运行 |
| 运维盲区 | 需自行集成 Health Check、Metrics、日志收集 | 内置 Actuator 提供生产级监控端点 |
| 启动缓慢 | 大量 XML 解析、手动初始化数据源 | 条件化自动配置,按需装配,启动更快 |
Spring Boot 并非 Spring Framework 的替代品,而是构建在 Spring Framework 之上的增强层(详见本章「Spring Boot 与 Spring Framework 的关系」)。
适用位置与常用属性
Spring Boot 本身不是一个注解或类,而是一个框架体系。它通过以下核心入口点融入项目:
| 入口点 | 类型 | 作用 | 典型出现位置 |
|---|---|---|---|
SpringApplication.run() | 静态方法 | 启动整个Spring Boot应用 | 主启动类的 main() 方法 |
@SpringBootApplication | 组合注解 | 启用自动配置、组件扫描、配置类 | 主启动类声明 |
spring-boot-starter-parent | Maven父POM | 统一版本管理、插件配置 | pom.xml 的 <parent> 节点 |
application.yml | 配置文件 | 外部化配置,覆盖自动配置默认值 | src/main/resources |
常用版本选择
| 版本 | 对应Spring Framework | 最低Java版本 | 状态 |
|---|---|---|---|
| 2.7.x | 5.3.x | Java 8 | 本教程采用(2.7.18),维护期至2025年 |
| 3.0.x | 6.0.x | Java 17 | 使用 jakarta 命名空间 |
| 3.2.x | 6.1.x | Java 17 | 当前主流推荐 |
本教程统一采用 Spring Boot 2.7.18(对应 Spring Framework 5.3.x),兼容 Java 8,使用
javax命名空间,与飞翔科技现有基础设施兼容。
核心原理
Spring Boot 在Spring生态中的位置
层次解读:
- JVM/服务器层:Spring Boot 将 Tomcat 直接嵌入应用,应用本身即服务器进程。
- Spring Framework 核心层:IoC容器、AOP、数据访问、Web MVC等底层能力由 Spring Framework 提供(详见Spring Core教程)。
- Spring Boot 增强层:自动配置决定"何时装配哪些Bean";Starter决定"引入哪些依赖";Actuator提供运维端点;外部化配置让同一份代码在不同环境表现不同。
三大核心能力的协作关系
完整示例
场景说明
广州飞翔科技的技术部正在开发一套学生成绩管理系统。架构师白歌需要向后端开发小崔解释:"为什么我们要用Spring Boot而不是传统Spring MVC?" 白歌决定用两个项目对比来说明。
操作前:传统SSM项目结构(对比项)
传统 Spring + Spring MVC + MyBatis 项目(简称 SSM)需要以下配置:
ssm-student/
├── src/main/resources/
│ ├── spring/
│ │ ├── applicationContext.xml ← 数据源、事务、扫描包
│ │ ├── spring-mvc.xml ← 视图解析器、静态资源、注解驱动
│ │ └── mybatis-config.xml ← 别名、映射文件路径
│ ├── jdbc.properties ← 数据库连接参数
│ └── log4j.properties
└── webapp/WEB-INF/
└── web.xml ← DispatcherServlet、ContextLoaderListener、字符编码过滤器
web.xml 片段:
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
小崔数了数:仅配置相关的 XML 和 properties 文件就超过 200 行,而业务代码还没开始写。
使用Spring Boot的完整代码
同一个学生成绩管理系统,用Spring Boot 2.7.18实现:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
<groupId>com.feixiang</groupId>
<artifactId>student-management</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
application.yml(统一YAML格式):
spring:
datasource:
url: jdbc:mysql://localhost:3306/student_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
server:
port: 8080
主启动类:
package com.feixiang.student;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class StudentManagementApplication {
public static void main(String[] args) {
SpringApplication.run(StudentManagementApplication.class, args);
}
}
业务组件(StudentService):
package com.feixiang.student.service;
import org.springframework.stereotype.Service;
@Service
public class StudentService {
public String queryScore(String studentId) {
return "学生 " + studentId + " 的成绩查询结果";
}
}
操作后运行结果及分析
启动应用后,控制台输出:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.18)
2024-05-20 09:15:32.123 INFO 12345 --- [main] c.f.s.StudentManagementApplication : Starting StudentManagementApplication
2024-05-20 09:15:33.789 INFO 12345 --- [main] o.s.b.w.e.t.TomcatWebServer : Tomcat started on port(s): 8080 (http)
2024-05-20 09:15:34.123 INFO 12345 --- [main] c.f.s.StudentManagementApplication : Started in 2.345 seconds
分析:
- 零 XML:整个项目没有
web.xml,没有spring-mvc.xml,没有applicationContext.xml。 - 自动装配数据源:因为类路径存在
spring-jdbc和HikariCP,Spring Boot 自动创建DataSourceBean 并注入application.yml中的连接参数。 - 自动装配 Web 环境:因为类路径存在
spring-boot-starter-web,Tomcat 自动启动,端口 8080,DispatcherServlet 自动注册到/。 - 组件自动扫描:
@SpringBootApplication隐式包含@ComponentScan,StudentService被自动发现并注册为 Bean。
小崔感叹:"传统 SSM 我写了 200 行配置,Spring Boot 我只写了 10 行
application.yml,效果完全一样!"
易错场景与面试考点
易错场景:把 Spring Boot 当成 Spring Framework 的替代品
小崔曾以为:"用了 Spring Boot 就不需要学 Spring Framework 了。" 结果在排查一个 Bean 循环依赖问题时完全无从下手。
错误认知:
// 小崔试图在 Spring Boot 中完全绕过 Spring Core 的概念
@Service
public class StudentService {
@Autowired // 虽然能工作,但小崔不知道这是 Spring Core 的 IoC/DI 机制
private StudentRepository repository;
}
后果:Spring Boot 的自动配置、条件注解、外部化配置等所有能力都建立在 Spring Framework 的 IoC 容器之上。不懂 Spring Core 的 Bean 生命周期、作用域、依赖注入,就无法理解 Spring Boot 自动配置为什么有时不生效、为什么 @ConditionalOnMissingBean 能工作。遇到复杂问题时(如自定义 AutoConfiguration、调整 BeanPostProcessor 顺序),缺乏 Spring Framework 功底会让小崔寸步难行。
正确认知:Spring Boot 是用法的简化,不是原理的替代。Spring Framework 的 IoC、AOP、事务管理依然是底层基石(详见 Spring Core 教程)。
面试考点
Q:Spring Boot 的三大核心设计目标是什么?
① 快速搭建:通过 Spring Initializr 几分钟内生成可运行项目骨架;② 开箱即用:提供大量 Starter,自动引入兼容的依赖版本组合;③ 无服务器绑定:内嵌 Tomcat/Jetty/Undertow,无需部署 WAR 文件。此外还包括"无代码生成"和"生产就绪"(Actuator)。
Q:Spring Boot 2.7.x 与 3.x 的最大区别是什么?
版本基底不同:2.7.x 基于 Spring Framework 5.3.x,兼容 Java 8,使用
javax.servlet命名空间;3.x 基于 Spring Framework 6.x,要求 Java 17+,使用jakarta.servlet命名空间(Jakarta EE 9+)。迁移 3.x 需要改包名和升级 JDK。
Q:Spring Boot 的自动配置和 Spring Framework 的 Java Config 是什么关系?
Spring Framework 的
@Configuration+@Bean提供了"手动配置"的能力;Spring Boot 的自动配置是在此基础上,通过spring.factories和条件注解实现"根据 classpath 自动判断、自动注册",本质仍是 Spring Framework 的@Configuration类,只是由框架自动加载而非开发者手写。