1. Spring Boot 到底是什么?为什么 Java 后端几乎绕不开它?
1.1 它不是新语言,也不是替代 Spring,而是 Spring 应用的工程化脚手架
Spring Boot 的出现,本质上是为了解决传统 Spring 项目启动慢、配置多、依赖难配、上线监控成本高的问题。过去搭一个 Java Web 项目,开发者经常要花大量时间配置 XML、Servlet、Tomcat、数据源、日志、事务、监控。业务还没开始写,项目基础设施已经让人头大。
Spring Boot 把这些重复劳动抽象成 Starter、自动配置、内嵌 Web 容器、外部化配置和 Actuator。这样一来,开发者不用从零开始拼各种组件,而是站在一套标准化工程体系上快速开发。
1.2 Spring Boot 的核心关键词
第一,Starter:把常用依赖打包成一组好用的依赖集合;第二,AutoConfiguration:根据你引入的 jar 和配置自动装配组件;第三,Embedded Server:内嵌 Tomcat、Jetty 或 Undertow,让应用可以直接运行;第四,Externalized Configuration:把配置放到文件、环境变量、命令行或配置中心;第五,Actuator:提供生产环境需要的健康检查和指标监控。
2. Spring Boot 整体架构:从入口类到业务服务
2.1 先从分层看,不要一上来就背注解
一个典型 Spring Boot 应用,可以从外到内分成启动入口、Spring 容器、自动配置、Web 层、业务层和基础设施层。启动入口负责拉起整个应用;Spring 容器负责管理 Bean;自动配置负责帮你创建常见组件;Web 层负责接收请求;业务层负责业务逻辑;基础设施层负责数据库、缓存、消息队列和外部服务。
面试时如果能先把这张大图讲清楚,再去讲启动流程、自动配置、事务、AOP,就会显得非常有体系。
3. Spring Boot 启动流程:main 方法背后发生了什么?
3.1 启动不是简单 new 一个对象,而是拉起一整套容器体系
当你调用 SpringApplication.run() 时,Spring Boot 会先准备运行环境,例如读取配置、处理 Profile、初始化日志;然后创建 ApplicationContext,也就是 Spring 容器;接着扫描 Bean、解析配置类、执行自动配置;随后刷新容器,完成 Bean 的实例化、依赖注入和生命周期回调;如果是 Web 应用,还会启动内嵌 Web 容器,开始监听端口。
所以启动流程可以压缩成一句话:准备环境,创建容器,加载 Bean,执行自动配置,启动 Web 容器,发布就绪事件。
3.2 为什么启动流程是面试高频?
因为很多线上问题都能从启动流程里找到线索。比如配置没有生效,可能是 Profile 或配置优先级问题;Bean 创建失败,可能是依赖注入或自动配置条件问题;端口被占用,是 Web 容器启动阶段的问题;初始化很慢,可能是某些 Bean 在启动时执行了过重逻辑。
4. 自动配置原理:Spring Boot 最核心的“省配置”能力
4.1 自动配置不是魔法,而是一组条件判断
Spring Boot 官方文档中说明,自动配置会尝试根据你添加到 classpath 的 jar 依赖来自动配置 Spring 应用。例如,如果相关数据库驱动和配置存在,Spring Boot 就会尝试配置数据源。你也可以通过 @SpringBootApplication 或 @EnableAutoConfiguration 开启这种能力。
从工程角度看,自动配置的逻辑可以理解为:你引入了 Starter,Starter 带来了相关依赖;Spring Boot 找到对应的自动配置类;自动配置类再根据条件注解判断是否生效;条件满足时就创建 Bean。
4.2 自动配置为什么不会完全失控?
因为很多自动配置都会通过条件注解做保护。最典型的是 @ConditionalOnMissingBean:如果你已经自己定义了某个 Bean,Spring Boot 通常不会再自动创建同类 Bean。也就是说,默认情况下它帮你配好;当你想接管时,它会让位。
5. IoC、DI 与 Bean 生命周期:Spring Boot 的地基仍然是 Spring
5.1 IoC:对象控制权交给容器
Spring Boot 看起来很新,但它的地基仍然是 Spring Framework 的 IoC 容器。IoC 可以理解为:对象不再由业务代码自己到处 new,而是交给 Spring 容器统一创建、配置、装配和管理。
DI 也就是依赖注入,是 IoC 最常见的落地方式。对象需要依赖什么,不再自己创建,而是在构造方法、工厂方法或属性里声明,由容器在创建对象时注入进去。Spring 官方文档也把依赖注入解释为:对象只通过构造参数、工厂方法参数或属性定义依赖,容器在创建 Bean 时注入这些依赖。
5.2 Bean 生命周期为什么重要?
因为很多高级问题都和生命周期有关。例如 BeanPostProcessor 为什么能增强 Bean,@PostConstruct 什么时候执行,AOP 代理什么时候生成,为什么有些 Bean 初始化太早会拿不到代理对象。这些问题都绕不开 Bean 生命周期。
6. Spring Boot Web 请求链路:一个 HTTP 请求如何被处理?
6.1 请求不是直接进 Controller,而是经过一条链路
一个请求进入 Spring Boot Web 应用,首先会被内嵌 Tomcat 等 Web 容器接收,然后经过 Filter,进入 DispatcherServlet,再通过 HandlerMapping 找到对应 Controller 方法。Controller 完成参数绑定和校验后调用 Service,Service 再访问数据库、缓存或远程服务,最后返回结果并序列化成 JSON。
6.2 Filter、Interceptor、AOP 的区别
Filter 更靠近 Servlet 容器,适合做跨域、编码、请求日志。Interceptor 属于 Spring MVC,适合做登录校验、权限判断、接口耗时统计。AOP 更靠近业务方法,适合做事务、监控、日志、埋点和权限切面。
7. 外部化配置与 Profile:同一套代码如何跑多个环境?
7.1 配置体系的目标:让代码和环境差异分离
Spring Boot 官方文档明确指出,外部化配置可以让同一套应用代码在不同环境工作,配置来源可以包括 properties、YAML、环境变量和命令行参数。实际工程中,还会接入 Nacos、Apollo、Spring Cloud Config 等配置中心。
这就解决了一个关键问题:开发、测试、预发、生产环境的数据库地址、Redis 地址、MQ 地址、日志级别、开关配置都不一样,但业务代码不应该跟着变化。
7.2 Profile 的正确用法
Profile 适合区分环境,例如 dev、test、prod。但不要把 Profile 滥用成复杂业务开关。业务开关更适合用配置中心、灰度开关或专门的 feature flag 系统管理。
8. 数据访问与事务:Spring Boot 如何接入数据库?
8.1 Spring Boot 会自动帮你装配数据访问常见组件
当你引入 JDBC、JPA、MyBatis、数据库驱动等依赖,并提供必要配置后,Spring Boot 会尝试帮你配置 DataSource、连接池、事务管理器等常见组件。业务层只需要通过 Repository、Mapper 或 JdbcTemplate 等方式访问数据。
8.2 事务边界为什么一般放在 Service 层?
因为一个业务动作往往由多个数据操作组成。比如创建订单可能涉及写订单表、扣库存、写支付记录、发消息。如果事务放在 DAO 层,只能覆盖很小的单表操作;放在 Service 层,才能覆盖整个业务动作。
8.3 @Transactional 常见坑
第一,同类内部方法调用可能绕过代理,事务不生效;第二,默认对 RuntimeException 回滚,受检异常需要单独配置;第三,事务方法要通过 Spring 管理的代理对象调用;第四,事务范围不要过大,否则容易长时间占用连接和锁。
9. Actuator:Spring Boot 上线后的“体检仪表盘”
9.1 应用能启动,不代表它在生产环境可管理
Spring Boot Actuator 提供了一组生产可用能力。官方文档中把它称为用于监控和管理应用的生产级特性,可以通过 HTTP 端点或 JMX 进行管理,并支持审计、健康检查和指标采集。
常见端点包括 health、metrics、info、env、loggers、prometheus 等。health 常用于容器健康检查;metrics 用于采集 JVM、HTTP、线程池指标;loggers 可以在不重启的情况下调整日志级别。
9.2 Actuator 不能裸露在公网
生产环境中,Actuator 端点必须做访问控制。尤其是 env、beans、loggers 等端点,可能暴露配置或影响运行状态。正确做法是限制端点暴露范围、加认证、走内网或运维平台统一访问。
10. Spring Boot 线上排障:面试最能拉开差距的一部分
10.1 启动失败怎么排查?
先看异常栈最底层根因,不要只看最外层 BeanCreationException。常见原因包括端口占用、配置缺失、Bean 冲突、循环依赖、自动配置条件不满足、数据库连接失败。
10.2 接口慢怎么排查?
先看是否所有接口都慢,还是某几个接口慢。再看耗时在网关、应用、数据库、缓存、远程调用哪一层。常用抓手包括日志 Trace、APM、SQL 慢日志、线程栈、连接池指标。
10.3 事务不生效怎么排查?
重点看三件事:方法是不是通过代理对象调用;异常类型是否会触发回滚;事务边界是否放在真正的业务入口上。很多事务问题不是注解写错,而是调用路径绕过了代理。
11. Spring Boot 高频面试题快答
问题 | 高质量回答思路 |
Spring Boot 和 Spring 有什么区别? | Spring 是基础框架,提供 IoC、AOP、事务、MVC 等能力;Spring Boot 是在 Spring 之上的工程化封装,提供 Starter、自动配置、内嵌容器、外部化配置和 Actuator,让应用更快启动和上线。 |
@SpringBootApplication 做了什么? | 它是组合注解,通常包含配置类、组件扫描和自动配置能力,是 Spring Boot 应用的常见入口注解。 |
自动配置原理是什么? | 根据 classpath、配置项和已有 Bean,通过条件注解决定是否创建某些 Bean。默认帮你配置,但允许你自定义 Bean 接管。 |
为什么引入 Starter 就能用? | Starter 帮你组合了一组常用依赖,自动配置再根据这些依赖和配置决定创建哪些组件。 |
Spring Boot 怎么做多环境配置? | 通过 application.yml、Profile、环境变量、命令行参数和配置中心,把环境差异外部化。 |
Actuator 有什么用? | 提供健康检查、指标、环境信息、日志级别等生产级端点,帮助应用上线后被监控、管理和排障。 |
事务为什么不生效? | 常见原因有内部方法调用绕过代理、异常类型不触发回滚、方法不是 public、对象不是 Spring Bean、事务边界放错层。 |
12. 总结:Spring Boot 真正考的不是注解,而是工程体系
Spring Boot 的核心价值,是把 Spring 应用从“能写”推进到“更快开发、更易配置、更容易上线、更方便监控”。它通过 Starter 降低依赖管理成本,通过自动配置降低配置成本,通过内嵌容器降低部署成本,通过外部化配置适配多环境,通过 Actuator 提升生产可观测性。
面试时,不要把 Spring Boot 讲成一堆注解。更好的方式是围绕一条主线:应用如何启动、Bean 如何创建、自动配置如何生效、Web 请求如何流转、配置如何管理、事务如何控制、上线如何监控、故障如何排查。只要这条线讲清楚,Spring Boot 基本就算真正理解了。
附:30 秒面试快答模板
“Spring Boot 是对 Spring 应用开发的工程化封装,核心能力包括 Starter 依赖管理、自动配置、内嵌 Web 容器、外部化配置和 Actuator 生产监控。启动时,SpringApplication 会准备环境、创建 ApplicationContext、加载 Bean、执行自动配置并启动内嵌容器。自动配置不是魔法,而是通过条件注解根据 classpath、配置和已有 Bean 判断是否创建组件。真正上线时,还要关注配置管理、事务边界、Web 请求链路、Actuator 监控和线上排障。”