Spring Boot 面试八股 20 讲:高频知识点整理
Spring Boot 是 Java 后端开发中最常用的框架之一,也是面试中高频出现的知识点。很多同学在准备面试时,往往会感觉知识点很多、很散,不知道该从哪里开始梳理。
这篇文章我整理了 Spring Boot 面试中最常见、最核心、也最值得掌握的 20 个知识点。内容尽量用通俗的方式来说明,希望能够帮助初学者建立起一个更完整的知识框架。
1. 什么是 Spring Boot
Spring Boot 是基于 Spring 生态构建的快速开发框架,它的核心目标是简化 Spring 应用的搭建和开发过程。
在传统 Spring 项目中,开发者往往需要编写大量 XML 配置或者 Java 配置,而 Spring Boot 通过“约定大于配置”的思想,把很多默认配置提前做好,让开发者可以更专注于业务逻辑本身。
简单来说,Spring Boot 不是替代 Spring,而是让 Spring 更容易用。
2. Spring Boot 和 Spring 的区别
很多初学者会把这两个概念混在一起,其实它们不是同一个层面的东西。
Spring 更像是一个庞大的基础框架和生态系统,它提供了 IOC、AOP、事务管理、MVC 等核心能力。
而 Spring Boot 是建立在 Spring 基础之上的快速开发工具,它主要解决的是项目初始化麻烦、配置繁琐、部署复杂等问题。
可以这样理解:
- Spring 提供能力
- Spring Boot 提供更高效的使用方式
3. Spring Boot 的核心优点
Spring Boot 之所以流行,核心在于它解决了开发效率问题。
它最重要的几个优点如下:
- 自动配置,减少手动配置工作
- 起步依赖,简化依赖管理
- 内嵌服务器,项目打包后可直接运行
- 提供生产级监控能力,如 Actuator
这些特性让开发者能够更快地把一个 Web 项目搭起来,也让项目的部署方式变得更简单。
4. @SpringBootApplication 是什么
这是 Spring Boot 启动类上最常见的注解,也是很多面试题的起点。
它本质上是一个组合注解,通常包含以下几个核心能力:
- 声明当前类是配置类
- 开启自动配置
- 开启组件扫描
也就是说,当我们在启动类上加了 @SpringBootApplication 后,项目就具备了自动装配 Bean、扫描组件、完成启动配置的能力。
所以它不是一个普通注解,而是整个 Spring Boot 应用的入口标志。
5. 自动配置原理
自动配置是 Spring Boot 最核心的特性之一。
它的本质是:
根据项目当前依赖、运行环境和已有 Bean,自动决定是否创建某些配置和对象。
比如你引入了 Web 相关依赖,Spring Boot 就会自动帮你配置 MVC 相关组件;引入了数据库相关依赖,它就会自动配置数据源。
底层实现依赖大量条件注解,例如:
- @ConditionalOnClass
- @ConditionalOnMissingBean
- @ConditionalOnProperty
所以自动配置并不是“无脑配置”,而是“有条件地自动配置”。
6. starter 起步依赖是什么
starter 可以理解为一种“依赖打包方案”。
在没有 starter 的时候,我们往往需要手动引入很多相关依赖,比如 Web 开发需要引入 Servlet、JSON、日志等多个包。
而有了 starter 后,通常只需要引入一个,比如:
spring-boot-starter-web
它会把常见的 Web 开发依赖统一带进来。
因此,starter 的意义在于:
帮你简化依赖管理。
7. 自动配置和 starter 的区别
这两个概念长得很像,也经常一起出现,但含义并不一样。
starter 主要解决的是:
我要引入哪些依赖。
自动配置主要解决的是:
这些依赖引入之后,该如何自动帮我配置。
所以可以这样概括:
- starter 负责“带材料”
- 自动配置负责“自动施工”
这两个机制配合起来,才形成了 Spring Boot 的高效率开发体验。
8. 配置文件 application.yml 和 application.properties
在 Spring Boot 项目中,最常见的配置方式有两种:
- application.properties
- application.yml
它们的作用本质上是一样的,都是用来写外部化配置。
区别主要在写法上:
properties 更适合简单、扁平的配置;
yml 更适合层级结构明显的配置,比如数据源、Redis、MyBatis 等。
通常来说,现在的项目里 yml 更常见一些,因为可读性更好。
9. 配置优先级
Spring Boot 支持多种配置来源,例如:
- 配置文件
- 命令行参数
- 环境变量
- 系统属性
当同一个配置项在多个地方都存在时,就涉及“优先级覆盖”的问题。
基本理解是:
优先级高的配置,会覆盖优先级低的配置。
这也是为什么线上环境经常会通过环境变量或启动参数来覆盖配置文件中的默认值,因为这样更灵活,也更方便部署。
10. Profile 多环境配置
在实际开发中,项目往往需要区分多个环境,例如:
- 开发环境 dev
- 测试环境 test
- 生产环境 prod
这时就要用到 Profile。
它的作用是让同一个项目在不同环境下加载不同的配置。
例如开发环境连接本地数据库,生产环境连接线上数据库。
常见配置方式是:
spring: profiles: active: dev
这样项目启动时就会优先加载开发环境对应的配置。
11. @ConfigurationProperties 和 @Value 的区别
这两个注解都可以读取配置,但使用场景不同。
@Value 适合读取单个配置项,例如:
@Value("${server.port}") private Integer port;
而 @ConfigurationProperties 更适合读取一整组有结构的配置,例如数据源、自定义业务配置等。
它的优点是:
- 支持批量绑定
- 类型更安全
- 更适合大型项目维护
所以在项目中,零散配置可以用 @Value,成组配置更推荐 @ConfigurationProperties。
12. Bean 的常见注册方式
在 Spring Boot 中,Bean 是由容器统一管理的对象。
常见的注册方式有以下几种:
- 在类上使用 @Component
- 使用派生注解,如 @Service、@Controller、@Repository
- 在配置类方法上使用 @Bean
本质上,它们的目标都是一样的:
把对象交给 Spring 容器管理。
区别主要在于使用场景不同。
13. @Bean 和 @Component 的区别
这是一个非常经典的面试题。
@Component 是直接标在类上的,表示这个类需要被 Spring 扫描并注册进容器。
而 @Bean 一般标在配置类的方法上,表示方法返回的对象需要交给 Spring 管理。
通常来说:
- 自己写的普通业务类,适合用 @Component 或其派生注解
- 第三方类、需要手动控制创建过程的对象,更适合用 @Bean
所以它们的核心区别在于“注册方式”和“适用场景”。
14. @Autowired 注入原理
@Autowired 用于自动注入依赖,是 IOC/DI 思想的具体体现。
它默认按照类型进行匹配。
如果容器中只有一个符合类型的 Bean,就直接注入。
如果有多个候选 Bean,则需要结合 @Qualifier 或 @Primary 来进一步指定。
现在项目中也越来越推荐使用构造器注入,因为它比字段注入更利于测试,也能更清晰地表达依赖关系。
15. Bean 的作用域
Bean 默认是单例的,也就是整个容器中通常只有一个实例。
常见作用域有:
- singleton:单例
- prototype:多例
- request:一次请求一个实例
- session:一次会话一个实例
大多数业务场景中,默认的 singleton 就足够了。
但如果对象是有状态的、或者和请求绑定,就可能需要考虑其他作用域。
16. Bean 的生命周期
Bean 从创建到销毁,会经历一个完整的生命周期。
大致过程可以概括为:
- 实例化
- 依赖注入
- 初始化
- 使用
- 销毁
开发中常见的生命周期扩展点包括:
- @PostConstruct:初始化后执行
- @PreDestroy:销毁前执行
理解 Bean 生命周期,有助于我们理解很多框架行为,比如初始化资源、关闭连接、执行启动逻辑等。
17. AOP 是什么
AOP 的全称是“面向切面编程”。
它的核心作用是:
把一些通用逻辑从业务代码中抽离出来,统一处理。
比如:
- 日志记录
- 权限校验
- 性能统计
- 事务管理
这些功能如果全写进业务方法里,代码会非常混乱。
而 AOP 可以把这些横切逻辑统一织入到目标方法前后。
所以它的核心价值在于:
解耦和增强。
18. @Transactional 事务原理和失效场景
@Transactional 是 Spring 中最常见的声明式事务注解。
它的本质是基于 AOP 代理实现的。
也就是说,当方法被代理对象调用时,Spring 会在方法执行前开启事务,在方法执行成功后提交事务,出现异常时回滚事务。
不过它也有一些常见失效场景,例如:
- 同类内部方法直接调用
- 异常被手动捕获后没有继续抛出
- 方法没有被 Spring 管理
- 事务方法没有通过代理对象调用
所以面试中如果问事务原理,最好顺带把“失效场景”一起说出来,这样会更完整。
19. 全局异常处理
在 Web 项目中,如果每个接口都手动写 try-catch,代码会很乱,也不利于统一维护。
因此实际开发中通常会使用:
- @RestControllerAdvice
- @ExceptionHandler
来做全局异常处理。
这样可以把系统异常、业务异常、参数异常统一拦截,然后返回统一格式的错误信息。
它的价值主要有三点:
- 统一返回格式
- 减少重复代码
- 提高可维护性
这也是后台管理系统中非常常见的一种写法。
20. 参数校验与 Actuator 监控
一个成熟的 Spring Boot 项目,除了业务能跑,还应该具备基本的健壮性和可观测性。
参数校验
通常会借助 Validation 注解完成,例如:
- @NotNull
- @NotBlank
- @Min
这样可以在参数进入业务层之前先做拦截,避免脏数据进入系统。
Actuator
Actuator 是 Spring Boot 提供的生产级监控模块,常见端点包括:
- health
- info
- metrics
- env
它可以帮助开发者查看应用健康状态、环境信息和性能指标,是线上运维和排查问题的重要工具。
总结
Spring Boot 面试题虽然看起来很多,但如果从整体上看,它其实有一条很清晰的主线:
自动配置 -> Bean 管理 -> 配置体系 -> AOP/事务 -> 工程化能力
只要把这条主线理顺,再去看具体知识点,就不会觉得零散。
对于初学者来说,不建议一开始就死记硬背所有问题,而是应该边做项目边理解这些概念。因为很多知识点,比如自动配置、Bean 生命周期、事务失效、全局异常处理,只有结合实际开发场景,才会真正理解透。
如果把这 20 个知识点掌握扎实,那么无论是写项目,还是准备 Spring Boot 面试,都会更有底气。
更多推荐


所有评论(0)