Appearance
Spring Boot
很多人第一次接触 Spring Boot,最直观的感受通常是:怎么几乎不写配置就能把项目跑起来。
这当然是它最明显的体验优势,但还不够。Spring Boot 真正解决的是:怎么把原本搭建复杂、配置零散、依赖繁琐的 Spring 应用,用更统一、更自动化的方式组织起来。
这篇主要看:
Spring Boot到底是什么- 它为什么会出现
- 它具体解决了什么问题
- 自动配置到底在做什么
- 它和
Spring Framework、Spring MVC的关系是什么
1. Spring Boot 到底是什么
Spring Boot 直接看成:建立在 Spring Framework 之上的快速应用开发体系。
它的核心目标不是替代 Spring,而是把 Spring 应用的启动、依赖选择、配置组织和运行方式大幅简化。把这层关系记成:
- Spring Framework 还是底座
- Spring MVC 还是 Web 层框架
- Spring Boot 负责把这些能力更省心地组装起来
2. 它为什么会出现
在 Spring Boot 出现之前,Spring 项目常见的问题包括:
- XML 配置很多
- 项目初始化繁琐
- 依赖组合要自己配
- Web 容器部署步骤重
- 环境配置不统一
于是团队经常会在“真正写业务之前”,先花很多时间搭框架。
Spring Boot 出现,就是为了改变这一点。
它想解决的核心问题是:不要让搭建项目本身,比写业务还重。
3. Spring Boot 主要解决什么问题
3.1 依赖选择复杂
以前要自己挑很多依赖,还得手动考虑版本兼容。
Spring Boot 用 starter 把常见依赖组合收口。
3.2 配置太散
以前很多配置要手写在 XML 或各种零散配置类里。
Spring Boot 更强调:约定优于配置。
也就是常见场景先给你合理默认值,你只在需要时覆盖。
3.3 启动流程麻烦
以前一个 Web 项目跑起来,往往还要单独部署到外部容器。
Spring Boot 更常见的做法是:内嵌服务器,应用自己就能启动。
3.4 环境切换不方便
不同环境的配置管理如果没有统一模型,维护成本会越来越高。
Spring Boot 提供了更系统化的外部化配置和 Profile 机制。
4. 什么叫“约定优于配置”
这是 Spring Boot 最常被提到的一句话。
直接看成:大多数常见场景,框架先给你一套合理默认方案,而不是要求你每件事都从零手写。
例如:
- Web 项目默认端口和服务器能力
- JSON 转换器
- 常见日志配置
- 数据源初始化方式
这并不等于“不能配”,而是:能不手写的,就尽量别让你手写。
5. starter 到底是什么
starter 可以理解成 一组按场景打包好的依赖起步器。
它解决的是 不要每做一个能力都自己去一条一条挑依赖。
例如常见的:
spring-boot-starter-webspring-boot-starter-jdbcspring-boot-starter-data-redisspring-boot-starter-test
它们的核心价值在于:
- 帮你带上常用依赖组合
- 帮你减少版本冲突处理成本
- 让项目按场景快速起步
例如一个最简单的 Web 应用,pom.xml 里往往只需要:
xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>然后很多 Web 层基础能力就已经跟着进来了。
6. 自动配置到底在做什么
自动配置 是 Spring Boot 最核心的能力之一。
它可以看成 Spring Boot 根据你引入的依赖、当前环境和配置条件,自动帮你装配一部分常用 Bean 和基础能力。
它解决的是 很多通用基础设施,不要每个项目都手动重复配一遍。
例如引入 Web 相关依赖后,框架通常会自动帮你准备一部分:
- MVC 基础配置
- JSON 转换能力
- 嵌入式服务器支持
这并不是“瞎猜”,而是:按条件判断后做自动装配。
把 Boot 启动和自动配置压成一条主线,看这张流程图:
mermaid
flowchart TD
A[执行 main 方法] --> B[SpringApplication.run]
B --> C[创建并刷新 ApplicationContext]
C --> D[读取 application.yml 和环境变量]
D --> E[组件扫描]
E --> F[加载自动配置类]
F --> G{条件是否满足}
G -->|满足| H[注册默认 Bean]
G -->|不满足| I[跳过该自动配置]
H --> J[创建内嵌服务器与基础设施]
I --> J
J --> K[应用启动完成]例如你只写一个 Controller:
java
/**
* 最小可运行的 HTTP 接口示例。
*/
@RestController
public class HelloController {
/**
* 返回一个最简单的启动结果,方便确认 Boot Web 应用已经跑起来。
*
* @return 包含欢迎信息的响应体
*/
@GetMapping("/hello")
public Map<String, Object> hello() {
return Map.of("message", "hello boot");
}
}但它能跑起来的前提,其实包括了 Boot 自动帮你准备的一批基础设施:
DispatcherServlet- JSON 消息转换器
- 内嵌 Web 服务器
- 常见 MVC 配置
7. @SpringBootApplication 到底做了什么
这是 Spring Boot 最常见的入口注解。
它直接看成:把应用启动、组件扫描和自动配置这些常见入口能力打包到一起。
在理解层面,先记住它通常关联的几件事就够了:
- 启动 Spring 应用上下文
- 扫描组件
- 开启自动配置
所以它不是一个“单点魔法注解”,而是 Boot 应用入口能力的收口表达。
7.1 @SpringBootApplication 为什么说是组合注解
这是 Boot 特别值得单独记住的一个点。
它可以近似理解成下面 3 个核心能力的组合:
@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
对应做的几件关键事分别是:
- 当前类是一个配置入口类
- 开启自动配置
- 从当前包开始做组件扫描
最常见的启动类大概就是这样:
java
/**
* Spring Boot 应用启动入口。
*/
@SpringBootApplication
public class DemoApplication {
/**
* 启动当前 Boot 应用。
*
* @param args 命令行启动参数
*/
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}如果拆开理解,大致可以近似看成:
java
/**
* 拆开后的启动配置示例,用来说明 `@SpringBootApplication` 的组合能力。
*/
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class DemoApplication {
}8. 为什么 Spring Boot 能自己跑起来
很多传统 Java Web 项目都要部署到外部 Tomcat。
而 Spring Boot 的一个重要变化是:它通常内嵌了 Web 服务器。
也就是说,应用打包后,自己就能带着服务器启动。
这解决的是:
- 部署流程更轻
- 本地开发更方便
- 交付形态更统一
这也是为什么 Boot 项目常常一个 jar 就能直接运行。
8.1 一个最小可运行示例
下面这几个文件加起来,基本就是一个最小 Boot Web 应用骨架:
java
/**
* 最小 Boot Web 应用的启动入口。
*/
@SpringBootApplication
public class DemoApplication {
/**
* 启动应用,并创建 Spring 容器与内嵌 Web 服务器。
*
* @param args 命令行启动参数
*/
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}java
/**
* 最小 Web 控制器示例。
*/
@RestController
@RequestMapping("/api")
public class HelloController {
/**
* 返回一个简单的 JSON 响应,验证 MVC 基础设施已自动准备完成。
*
* @return 包含固定消息的响应体
*/
@GetMapping("/hello")
public Map<String, String> hello() {
return Map.of("message", "hello");
}
}9. 外部化配置和 Profile 是什么
这块也是 Boot 特别重要的工程能力。
9.1 外部化配置
它解决的是 配置不要硬编码在代码里,而要能按环境独立管理。
常见做法包括:
application.ymlapplication.properties- 环境变量
- 命令行参数
9.2 Profile
Profile 可以理解成 一组面向不同环境的配置切换能力。
例如:
devtestprod
它解决的是 不同环境配置不要混在一套文件里硬改。
例如:
yaml
server:
port: 8080
spring:
application:
name: demo-appyaml
spring:
config:
activate:
on-profile: dev
datasource:
url: jdbc:mysql://localhost:3306/demojava
/**
* 仅在开发环境生效的短信发送实现。
*/
@Service
@Profile("dev")
public class LocalSmsSender implements SmsSender {
}9.3 配置绑定常用注解
这部分也很常用:
| 注解 | 作用 |
|---|---|
@Value | 读取单个配置值 |
@ConfigurationProperties | 把一组配置绑定到对象 |
@EnableConfigurationProperties | 开启配置属性类注册 |
@Profile | 按环境启用 Bean |
例如:
java
/**
* 把 `app.sms` 前缀下的一组配置统一绑定到对象上。
*/
@ConfigurationProperties(prefix = "app.sms")
public class SmsProperties {
private String endpoint;
private String apiKey;
// getter/setter
}10. Spring Boot 和 Spring MVC 是什么关系
这两个概念经常被混。
Spring MVC是 Web 框架Spring Boot是更高层的工程化体系
Spring Boot 经常自动配置 Spring MVC,让你更快搭好 Web 项目,但它本身不等于 MVC。
11. Spring Boot 和 Spring Framework 是什么关系
也不是替代关系。
Spring Framework 提供基础能力,Spring Boot 负责把这些能力按现代应用开发方式重新组织起来。
所以如果只会 Boot,不理解 Spring 容器、AOP、事务、Bean 这些底层概念,很多问题还是会讲不透。
12. 工程上最常见的几个误区
12.1 误区一:Spring Boot 是新框架,Spring 旧了
不是。
Boot 不是替代 Spring,而是站在 Spring 之上的简化体系。
12.2 误区二:自动配置等于完全不用理解底层
自动配置帮你省掉了大量重复劳动,但出了问题时,仍然要回到底层 Bean、容器和装配逻辑去看。
12.3 误区三:用了 Boot,就不需要关注配置设计
Boot 只是让配置更容易组织,不代表配置本身就不会失控。
环境隔离、敏感配置、配置来源优先级这些问题仍然要认真处理。
12.4 误区四:Boot 项目快,不代表数据库、缓存、线程池等基础设施就自动合理
Boot 解决的是启动和组织问题,不是替你自动完成所有工程治理。
13. 一句话总结
Spring Boot 的核心价值,是把原本复杂的 Spring 项目搭建、依赖选择、自动装配和应用启动流程统一简化,让团队能把更多精力放在业务和工程治理本身。