Skip to content

Spring Boot ​

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

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

这篇主要看:

  1. Spring Boot 到底是什么
  2. 它为什么会出现
  3. 它具体解决了什么问题
  4. 自动配置到底在做什么
  5. 它和 Spring Framework、Spring 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 Boot 和 Spring MVC 是什么关系 ​

这两个概念经常被混。

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

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