十二月 21, 2025
13 分钟阅读

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

interview
career-advice
job-search
Java 后端开发面试题:Spring Boot、JPA 与 API
Milad Bonakdar

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 注解。

答案: 它是一个方便的注解,结合了其他三个注解:

  1. @Configuration 将该类标记为 bean 定义的来源。
  2. @EnableAutoConfiguration 告诉 Spring Boot 开始根据类路径设置、其他 bean 和各种属性设置添加 bean。
  3. @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): 您可以配置事务如何与现有事务相关(例如,REQUIREDREQUIRES_NEW)。

稀有度: 常见 难度: 中等


高级主题

16. 什么是 Spring Cloud Config?

答案: Spring Cloud Config 为分布式系统中的外部化配置提供服务器端和客户端支持。

  • 配置服务器(Config Server): 管理所有环境中应用程序的外部属性的中心位置。它可以由 Git、SVN 或 Vault 支持。
  • 好处: 您可以更改配置而无需重新部署应用程序(使用 @RefreshScope)。

稀有度: 不常见 难度: 中等


17. 解释 Spring Beans 中 SingletonPrototype 作用域之间的区别。

答案:

  • Singleton(默认): 每个 Spring IoC 容器只创建一个 bean 实例。它被缓存和重用。
  • Prototype: 每次请求 bean 时都会创建一个新实例。
  • 其他: Request、Session(Web 感知作用域)。

稀有度: 常见 难度: 简单


18. Java 中 CheckedUnchecked 异常之间有什么区别?

答案:

  • Checked 异常: 继承自 Exception(但不是 RuntimeException)。编译器强制您处理它们(try-catch)或声明它们(throws)。示例:IOExceptionSQLException。表示可恢复的条件。
  • Unchecked 异常: 继承自 RuntimeException。编译器不强制您处理它们。示例:NullPointerExceptionIllegalArgumentException。表示编程错误。默认情况下,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): filtermapsorted(惰性)。
    • 终端操作(Terminal): collectforEachreduce(触发处理)。
  • 并行流(Parallel Streams): 可以使用多个线程并行处理数据 (.parallelStream())。

稀有度: 常见 难度: 中等

Newsletter subscription

真正有效的每周职业建议

将最新见解直接发送到您的收件箱

您的下一次面试只差一份简历

在几分钟内创建一份专业、优化的简历。无需设计技能——只有经过验证的结果。

创建我的简历

分享这篇文章

让您的6秒钟发挥作用

招聘人员平均只花6到7秒扫描简历。我们经过验证的模板旨在立即吸引注意力并让他们继续阅读。