Java 后端开发面试题:Spring Boot、JPA 与 API

Milad Bonakdar
作者
用实用问题准备 Java 后端面试,覆盖 Spring Boot、REST API、微服务、JPA/Hibernate、安全、测试和架构取舍。
介绍
Java 后端面试通常考察的是你能否构建和维护可靠的 API,而不只是背出框架名称。常见范围包括 Spring Boot、REST 设计、持久化、事务、测试、安全、可观测性,以及微服务系统中的架构取舍。
使用这份指南时,不要只记概念。每个答案都要能说明它解决什么问题、什么时候使用、可能出什么故障,以及你会如何测试或排查。到 2026 年,Java 17+ 基线、Java 21/25、Spring Boot 3/4 项目,以及 OAuth2/JWT 的现代 API 安全也值得掌握。
如何使用这份指南
- 先复习 Spring Boot 和 Java 基础题,再大声练习中等和较难的问题。
- 每个答案都补充一个来自你简历或作品集的真实项目例子。
- 遇到取舍题时,说明你默认会选什么,以及什么信号会让你改变方案。
- 如果简历里写了微服务、JPA、Kafka、Docker 或云部署,请准备一个具体的故障排查或调试故事。
Spring Boot 核心概念
1. 什么是 Spring Boot,它与传统的 Spring Framework 有何不同?
答案:
- Spring Framework: 一个用于企业 Java 开发的综合框架。它需要大量的手动配置(XML 或基于 Java 的配置)才能设置。
- Spring Boot: Spring Framework 的一个扩展,它简化了新 Spring 应用程序的设置和开发。
- 自动配置(Auto-Configuration): 根据类路径依赖自动配置 bean。
- 嵌入式服务器(Embedded Servers): 包括 Tomcat、Jetty 或 Undertow,因此您无需部署 WAR 文件。
- 启动器(Starters): 精心策划的依赖项,以简化构建配置。
- 约定优于配置(Opinionated Defaults): “约定优于配置”的方法。
稀有度: 常见 难度: 简单
2. 解释 @SpringBootApplication 注解。
答案: 它是一个方便的注解,结合了其他三个注解:
@Configuration: 将该类标记为 bean 定义的来源。@EnableAutoConfiguration: 告诉 Spring Boot 开始根据类路径设置、其他 bean 和各种属性设置添加 bean。@ComponentScan: 告诉 Spring 在当前包和子包中查找其他组件、配置和服务。
稀有度: 常见 难度: 简单
3. 什么是依赖注入 (DI) 和控制反转 (IoC)?
答案:
- IoC: 一种原则,其中对象创建和管理的控制权从程序员转移到容器(Spring IoC 容器)。
- DI: 一种用于实现 IoC 的设计模式。对象不是创建其依赖项,而是将它们“注入”到对象中(通过构造函数、Setter 或字段)。
- 好处: 解耦、更易于测试(模拟依赖项)和更好的可维护性。
稀有度: 非常常见 难度: 中等
4. 什么是 Spring Boot 启动器?举例说明。
答案: 启动器是一组方便的依赖描述符,您可以将其包含在您的应用程序中。它们包含您需要的所有依赖项,以便使用一致且受支持的托管传递依赖项集快速启动和运行项目。
- 示例:
spring-boot-starter-web:用于构建 Web 应用程序(包括 Tomcat 和 Spring MVC)。spring-boot-starter-data-jpa:用于将 Spring Data JPA 与 Hibernate 一起使用。spring-boot-starter-test:用于测试(包括 JUnit、Mockito)。spring-boot-starter-security:用于 Spring Security。
稀有度: 常见 难度: 简单
5. 什么是 Spring Actuator?
答案: Spring Boot Actuator 提供了生产就绪的功能,可帮助您监视和管理您的应用程序。
- 端点(Endpoints): 公开诸如
/health(应用程序状态)、/metrics(内存、CPU 使用率)、/info(应用程序信息)、/env(环境变量)之类的端点。 - 用法: 对于运营团队来说,检查生产中微服务的健康状况至关重要。
稀有度: 常见 难度: 中等
微服务与架构
6. 微服务相对于单体架构有哪些优势?
答案:
- 可扩展性: 可以根据需求独立扩展单个服务。
- 技术无关性: 不同的服务可以使用最适合该任务的不同技术(Java、Go、Python)。
- 故障隔离: 一个服务中的故障不一定会导致整个系统崩溃。
- 独立部署: 团队可以独立部署服务,从而实现更快的发布周期 (CI/CD)。
稀有度: 常见 难度: 中等
7. 什么是 API 网关?为什么要使用它?
答案: API 网关是一个充当系统单一入口点的服务器。它接收来自客户端的所有 API 调用,然后将它们路由到适当的微服务。
- 功能: 请求路由、组合和协议转换。
- 横切关注点: 身份验证、SSL 终止、速率限制、缓存、日志记录。
- 示例: Spring Cloud Gateway、Netflix Zuul、Kong。
稀有度: 非常常见 难度: 中等
8. 解释服务发现(Eureka)。
答案: 在微服务环境中,服务实例具有动态 IP 地址。服务发现是一种服务相互查找的机制。
- Eureka Server: 充当服务注册表。
- Eureka Client: 微服务在启动时向 Eureka Server 注册自己并发送心跳信号。
- 发现: 当服务 A 需要调用服务 B 时,它会向 Eureka 请求服务 B 的地址。
稀有度: 常见 难度: 中等
9. 什么是断路器模式?
答案: 断路器模式可防止应用程序重复尝试执行可能失败的操作(例如,调用已关闭的服务)。
- 状态:
- 关闭(Closed): 请求正常流动。
- 打开(Open): 请求立即被阻止(快速失败),以允许发生故障的服务恢复。
- 半开(Half-Open): 允许有限数量的请求通过,以测试服务是否已恢复。
- 工具: Resilience4j(推荐)、Hystrix(已弃用)。
稀有度: 非常常见 难度: 困难
数据库与 JPA
10. 什么是 JPA 和 Hibernate?
答案:
- JPA(Java Persistence API): 一种用于访问、持久化和管理 Java 对象与关系数据库之间数据的规范。它只是一个接口。
- Hibernate: JPA 规范最流行的实现。它是一个 ORM(对象关系映射)工具。
稀有度: 常见 难度: 简单
11. 解释 Hibernate 中的 N+1 Select 问题。
答案: 当数据访问框架执行 N 个额外的 SQL 语句来获取与执行主 SQL 查询时可以检索的相同数据时,就会发生 N+1 问题。
- 场景: 获取
Author列表(1 个查询)。迭代并访问author.getBooks()(N 个查询,每个作者一个查询)。 - 解决方案: 在 JPQL 中使用 Join Fetch (
SELECT a FROM Author a JOIN FETCH a.books) 或实体图(Entity Graphs)在单个查询中急切加载相关实体。
稀有度: 非常常见 难度: 中等
12. @Entity、@Table 和 @Column 之间有什么区别?
答案:
@Entity: 指定该类是一个实体,并映射到一个数据库表。@Table: 可选。指定用于映射的数据库表的名称。如果省略,则使用类名。@Column: 可选。指定字段或属性将映射到的列的详细信息。如果省略,则使用字段名称。
稀有度: 常见 难度: 简单
安全与测试
13. 如何保护 Spring Boot 应用程序的安全?
答案: 以 Spring Security 为基础,再根据应用类型说明安全模型。好的面试答案会区分身份验证、授权、令牌校验和运行时防护。
- 身份验证(Authentication): 确认是谁在调用 API,常见方式包括 OAuth2/OIDC、会话登录或服务间凭证。
- 授权(Authorization): 通过角色、scope、
@PreAuthorize这类方法级安全,以及SecurityFilterChain中的端点规则限制可执行操作。 - JWT/OAuth2 资源服务器: 对无状态 API,要校验 bearer token 的签发方、过期时间、签名和 scope,而不是盲目信任 token 内容。
- API 加固: 强制 HTTPS,明确配置 CORS,在浏览器会话中处理 CSRF,返回安全错误信息,加入限流,并审计敏感操作。
稀有度: 常见 难度: 中等
14. Mockito 中 @Mock 和 @InjectMocks 之间有什么区别?
答案:
@Mock: 创建类/接口的模拟对象。它没有任何实际行为;您可以使用when(...).thenReturn(...)定义其行为。@InjectMocks: 创建类的实例,并将使用@Mock(或@Spy)注解创建的模拟对象注入到此实例中。用于被测类。
稀有度: 常见 难度: 中等
15. 如何在 Spring Boot 中处理事务?
答案:
使用 @Transactional 注解。
- 机制: Spring 在类/方法周围创建一个代理。它在方法执行之前启动一个事务,并在方法返回后提交该事务。如果抛出
RuntimeException,它会回滚事务。 - 传播(Propagation): 您可以配置事务如何与现有事务相关(例如,
REQUIRED、REQUIRES_NEW)。
稀有度: 常见 难度: 中等
高级主题
16. 什么是 Spring Cloud Config?
答案: Spring Cloud Config 为分布式系统中的外部化配置提供服务器端和客户端支持。
- 配置服务器(Config Server): 管理所有环境中应用程序的外部属性的中心位置。它可以由 Git、SVN 或 Vault 支持。
- 好处: 您可以更改配置而无需重新部署应用程序(使用
@RefreshScope)。
稀有度: 不常见 难度: 中等
17. 解释 Spring Beans 中 Singleton 和 Prototype 作用域之间的区别。
答案:
- Singleton(默认): 每个 Spring IoC 容器只创建一个 bean 实例。它被缓存和重用。
- Prototype: 每次请求 bean 时都会创建一个新实例。
- 其他: Request、Session(Web 感知作用域)。
稀有度: 常见 难度: 简单
18. Java 中 Checked 和 Unchecked 异常之间有什么区别?
答案:
- Checked 异常: 继承自
Exception(但不是RuntimeException)。编译器强制您处理它们(try-catch)或声明它们(throws)。示例:IOException、SQLException。表示可恢复的条件。 - Unchecked 异常: 继承自
RuntimeException。编译器不强制您处理它们。示例:NullPointerException、IllegalArgumentException。表示编程错误。默认情况下,Spring 的@Transactional仅在 unchecked 异常上回滚。
稀有度: 常见 难度: 简单
19. Java 中的垃圾回收如何工作?
答案: 垃圾回收 (GC) 是自动回收不再可访问的对象所占用的内存的过程。
- 分代假设: 大多数对象都很短命。
- 堆结构: 年轻代(Eden、Survivor 空间)和老年代。
- Minor GC: 清理年轻代。速度快。
- Major/Full GC: 清理老年代。速度较慢,可能会导致“Stop-the-world”暂停。
- 算法: G1GC(现代 Java 中的默认算法)、ZGC、Shenandoah(低延迟)。
稀有度: 常见 难度: 困难
20. 什么是 Java Streams?
答案: Java 8 中引入的 Streams 提供了一种函数式方法来处理对象集合。
- 特点: 声明式、管道化、内部迭代。
- 操作:
- 中间操作(Intermediate):
filter、map、sorted(惰性)。 - 终端操作(Terminal):
collect、forEach、reduce(触发处理)。
- 中间操作(Intermediate):
- 并行流(Parallel Streams): 可以使用多个线程并行处理数据 (
.parallelStream())。
稀有度: 常见 难度: 中等


