核心概念

Spring Boot 是基于 Spring 框架的快速开发脚手架,通过 自动配置起步依赖嵌入式容器 三大核心特性,将传统 Spring 项目中繁琐的 XML 配置、依赖管理、容器部署等工作简化到极致。

选择 Spring Boot 的核心原因:

  • 开箱即用:零配置启动 Web 应用,集成主流中间件只需添加依赖
  • 微服务友好:与 Spring Cloud 无缝集成,天然适配微服务架构
  • 生产级特性:内置健康检查、监控指标、外部化配置等运维能力
  • 社区活跃:版本迭代快,主流技术栈(如 Redis、Kafka)快速集成

原理与关键点

1. 自动配置机制(Auto-Configuration)

传统 Spring 项目需要大量 XML 配置:

<!-- 传统 Spring:手动配置数据源 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>

Spring Boot 自动配置只需两步:

# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db
    username: root
    password: 123456
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

源码关键点

@SpringBootApplication 是三个注解的组合:

  • @SpringBootConfiguration:标识配置类
  • @EnableAutoConfiguration:启用自动配置
  • @ComponentScan:扫描当前包及子包的组件

@EnableAutoConfiguration 通过 AutoConfigurationImportSelector 加载 META-INF/spring.factories 中定义的自动配置类:

// spring-boot-autoconfigure.jar
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
...

每个自动配置类使用 @ConditionalOnClass@ConditionalOnMissingBean 等条件注解,只在特定条件下生效:

@Configuration
@ConditionalOnClass(DataSource.class) // Classpath 存在 DataSource 类时生效
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean // 用户未自定义 DataSource 时生效
    public DataSource dataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().build();
    }
}

2. 起步依赖(Starter Dependencies)

传统项目需要手动管理所有依赖及版本兼容性:

<!-- 传统方式:手动管理多个依赖 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.20</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>
<!-- ...还需要 10+ 个依赖 -->

Spring Boot Starter 一站式解决:

<!-- Spring Boot 方式:一个 Starter 包含所有依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

关键价值

  • 避免 JAR 包版本冲突(统一由 spring-boot-dependencies 管理)
  • 降低学习成本(不需要了解每个组件的具体依赖)
  • 快速集成中间件(如 spring-boot-starter-data-redis

3. 嵌入式容器

传统部署需要:

  1. 打包 WAR
  2. 下载 Tomcat
  3. 配置端口、JVM 参数
  4. 部署 WAR 到 Tomcat

Spring Boot 直接内嵌容器:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args); // 内嵌 Tomcat 启动
    }
}
# 打包成可执行 JAR
mvn package
# 直接运行
java -jar app.jar

优势

  • 简化部署(一个 JAR 即可)
  • 容器化友好(Docker 镜像更小)
  • 微服务标准化(每个服务独立运行)

性能与实践考量

1. 启动速度优化

开发环境关闭不必要的自动配置:

spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

生产环境使用 延迟初始化

spring:
  main:
    lazy-initialization: true # Bean 按需加载,减少启动时间

2. 生产级特性(Actuator)

Spring Boot Actuator 提供开箱即用的监控能力:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management:
  endpoints:
    web:
      exposure:
        include: health,metrics,info # 暴露健康检查、指标端点

关键端点

  • /actuator/health:健康检查(K8s 存活探针)
  • /actuator/metrics:JVM、HTTP 请求等指标(对接 Prometheus)
  • /actuator/env:环境变量、配置属性(生产环境需鉴权)

3. 微服务场景

Spring Boot + Spring Cloud 实现微服务标准化:

# 服务注册
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
@RestController
@RefreshScope // 动态刷新配置
public class OrderController {
    @Value("${order.max-limit}")
    private int maxLimit; // 从配置中心读取
}

分布式考量

  • 配置中心:Nacos、Apollo 统一管理配置
  • 链路追踪:Sleuth + Zipkin 追踪跨服务调用
  • 熔断降级:Sentinel 保护核心服务

面试答题总结

为什么选择 Spring Boot?

  1. 开发效率提升 10 倍
    • 传统 Spring 项目搭建需要半天(配置 XML、调试依赖冲突)
    • Spring Boot 初始化项目只需 5 分钟(Spring Initializr 生成)
  2. 降低运维复杂度
    • 嵌入式容器:无需单独部署 Tomcat,Docker 镜像更轻量
    • 外部化配置:通过环境变量、配置中心动态调整参数
  3. 微服务架构标配
    • 与 Spring Cloud 无缝集成(服务注册、配置中心、网关)
    • 符合云原生标准(健康检查、优雅停机、指标暴露)
  4. 社区生态强大
    • 官方 Starter 覆盖 90% 常用技术(Redis、Kafka、MongoDB)
    • 社区活跃,问题排查资源丰富

核心技术点

  • 自动配置:@Conditional 条件注解 + spring.factories SPI 机制
  • 起步依赖:统一版本管理,避免 JAR 冲突
  • 嵌入式容器:Tomcat/Jetty/Undertow 可切换

适用场景

  • 微服务架构(服务数量多,需要快速迭代)
  • 云原生应用(K8s 部署,需要容器化)
  • 中小型团队(减少配置工作量,聚焦业务)