Skip to content

Spring Boot

很多人第一次接触 Spring Boot,最直观的感受通常是:怎么几乎不写配置就能把项目跑起来。

这当然是它最明显的体验优势,但还不够。Spring Boot 真正解决的是:怎么把原本搭建复杂、配置零散、依赖繁琐的 Spring 应用,用更统一、更自动化的方式组织起来。

这篇主要看:

  1. Spring Boot 到底是什么
  2. 它为什么会出现
  3. 它具体解决了什么问题
  4. 自动配置到底在做什么
  5. 它和 Spring FrameworkSpring MVC 的关系是什么

1. Spring Boot 到底是什么

Spring Boot 直接看成:建立在 Spring Framework 之上的快速应用开发体系。

它的核心目标不是替代 Spring,而是把 Spring 应用的启动、依赖选择、配置组织和运行方式大幅简化。把这层关系记成:

  1. Spring Framework 还是底座
  2. Spring MVC 还是 Web 层框架
  3. Spring Boot 负责把这些能力更省心地组装起来

2. 它为什么会出现

在 Spring Boot 出现之前,Spring 项目常见的问题包括:

  1. XML 配置很多
  2. 项目初始化繁琐
  3. 依赖组合要自己配
  4. Web 容器部署步骤重
  5. 环境配置不统一

于是团队经常会在“真正写业务之前”,先花很多时间搭框架。

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 最常被提到的一句话。

直接看成:大多数常见场景,框架先给你一套合理默认方案,而不是要求你每件事都从零手写。

例如:

  1. Web 项目默认端口和服务器能力
  2. JSON 转换器
  3. 常见日志配置
  4. 数据源初始化方式

这并不等于“不能配”,而是:能不手写的,就尽量别让你手写。


5. starter 到底是什么

starter 可以理解成 一组按场景打包好的依赖起步器

它解决的是 不要每做一个能力都自己去一条一条挑依赖

例如常见的:

  1. spring-boot-starter-web
  2. spring-boot-starter-jdbc
  3. spring-boot-starter-data-redis
  4. spring-boot-starter-test

它们的核心价值在于:

  1. 帮你带上常用依赖组合
  2. 帮你减少版本冲突处理成本
  3. 让项目按场景快速起步

例如一个最简单的 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 相关依赖后,框架通常会自动帮你准备一部分:

  1. MVC 基础配置
  2. JSON 转换能力
  3. 嵌入式服务器支持

这并不是“瞎猜”,而是:按条件判断后做自动装配。

把 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 自动帮你准备的一批基础设施:

  1. DispatcherServlet
  2. JSON 消息转换器
  3. 内嵌 Web 服务器
  4. 常见 MVC 配置

7. @SpringBootApplication 到底做了什么

这是 Spring Boot 最常见的入口注解。

它直接看成:把应用启动、组件扫描和自动配置这些常见入口能力打包到一起。

在理解层面,先记住它通常关联的几件事就够了:

  1. 启动 Spring 应用上下文
  2. 扫描组件
  3. 开启自动配置

所以它不是一个“单点魔法注解”,而是 Boot 应用入口能力的收口表达。

7.1 @SpringBootApplication 为什么说是组合注解

这是 Boot 特别值得单独记住的一个点。

它可以近似理解成下面 3 个核心能力的组合:

  1. @SpringBootConfiguration
  2. @EnableAutoConfiguration
  3. @ComponentScan

对应做的几件关键事分别是:

  1. 当前类是一个配置入口类
  2. 开启自动配置
  3. 从当前包开始做组件扫描

最常见的启动类大概就是这样:

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 服务器。

也就是说,应用打包后,自己就能带着服务器启动。

这解决的是:

  1. 部署流程更轻
  2. 本地开发更方便
  3. 交付形态更统一

这也是为什么 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 外部化配置

它解决的是 配置不要硬编码在代码里,而要能按环境独立管理

常见做法包括:

  1. application.yml
  2. application.properties
  3. 环境变量
  4. 命令行参数

9.2 Profile

Profile 可以理解成 一组面向不同环境的配置切换能力

例如:

  1. dev
  2. test
  3. prod

它解决的是 不同环境配置不要混在一套文件里硬改

例如:

yaml
server:
  port: 8080

spring:
  application:
    name: demo-app
yaml
spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:mysql://localhost:3306/demo
java
/**
 * 仅在开发环境生效的短信发送实现。
 */
@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 BootSpring MVC 是什么关系

这两个概念经常被混。

  1. Spring MVC 是 Web 框架
  2. Spring Boot 是更高层的工程化体系

Spring Boot 经常自动配置 Spring MVC,让你更快搭好 Web 项目,但它本身不等于 MVC。


11. Spring BootSpring 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 项目搭建、依赖选择、自动装配和应用启动流程统一简化,让团队能把更多精力放在业务和工程治理本身。

基于 VitePress 构建的个人技术笔记。