使用 IntelliJ IDEA 调试 Spring Boot
1. 介绍
Spring Boot 通过只包含一些依赖项和最少的配置,使创建强大的应用变得容易。只需几行代码,我们就可以设置 HTTP 端点、连接到数据库和处理事件。这感觉就像魔法——直到出了问题。
出现问题时,调试变得至关重要。然而,理解 Spring Boot 应用幕后发生的事情可能很棘手。配置值可能来自多个来源,bean 可能是有条件加载的,事务问题可能很难确定。
在解决问题时,我们多久问一次自己这样的问题:
- 实际使用的属性值是什么?
- 注入了哪个 bean?
- 当前事务是否处于活动状态?
- 应用连接到哪个数据库?
本教程中,我们将探讨 IntelliJ IDEA 的 Spring Debugger 插件如何将 Spring 特定的见解添加到标准调试器中,并简化应用故障排除。
2. 开始使用 Spring Debugger
Spring Debugger 不需要特殊的配置,只需安装插件并在调试模式下运行应用即可。
它适用于以下运行配置类型:
- 原生 IntelliJ IDEA Spring Boot
- Maven
spring-boot:run命令 - Gradle
bootRun任务 - 仍然不支持远程连接(截至 2025 年 8 月)
该插件与 IDE 的内置调试器 API 集成,无需使用 Spring Boot Actuator 或其他额外的库或代理即可工作。
一旦我们安装了它,我们就可以立即开始使用它的所有功能来探索应用在运行时发生了什么——从 bean 开始
3. 查看运行时加载了哪些 Bean
当我们开始调试 Spring 应用时,第一个问题是:实际加载了哪些 bean?
Spring Debugger 将特定于 bean 的图标(按 bean 类型区分)添加到 Project 视图中:

如示例所示,我们有:
- 绿色表示已加载的 Bean
- 灰色表示扫描但为未加载的 Bean
- 橙色代表仿真 Bean
这种视觉反馈在测试或有多个实现可用时特别有用。我们还可以从当前应用上下文中评估任何 Spring bean。在 Evaluate Expression 窗口中,自动补全功能帮助我们直接在 bean 上调用方法,无需更改代码或重新启动。
一旦我们知道加载了哪些 bean,下一个挑战通常是弄清楚为什么应用的行为与我们的预期不同——这通常从配置开始。
4. 查看任何属性的实际值
属性并不总是按预期运行——它们的值可能取决于活动配置文件及其应用程序顺序,也可能来自环境变量或配置服务等外部来源。
Spring Debugger 配置文件中内联显示有效的属性值。点击它会导航到提供值的源代码,无论它是文件还是 Java 代码:

在调试会话期间,我们可以在“评估表达式(Evaluate Expression)”窗口中评估属性。在这种情况下,我们不仅可以看到值,还可以看到源代码,调试器会显示值是如何更新的堆栈跟踪。
对于环境变量、系统设置或配置服务器,即使无法导航,IDE 也会对源代码进行清晰的描述:

确认配置正确后,故障排除的另一个常见步骤是确保应用连接到正确的数据库。
5. 立即检查数据库连接
在运行集成测试时,应用连接到哪个数据库并不总是显而易见的,尤其是使用 Testcontainers 等工具时,端口和凭据可能会发生变化。
Spring Debugger 与数据库工具窗口集成,在运行时显示活动连接。我们可以在连接的容器或独立数据库中探索数据,而无需猜测连接字符串或扫描日志:

对于内存中的数据库,Spring Debugger 会显示连接,但无法显示 SCHEMA 或数据,因为这些数据库仅存在于应用进程中,如果没有专用端点,则无法通过 IDE 的 JDBC 驱动访问。对于这种情况,我们可以挂起应用并使用 bean——存储库、实体管理器或直接获取连接对象来执行 SQL 或 JPQL 查询
即使数据库连接正确,由于事务处理仍可能出现问题,而这些问题甚至更难诊断。
6. 诊断交易问题
一个常见的 Spring 错误是 LazyInitializationException,当我们访问活动事务之外的 JPA 实体时会发生这种情况。
在调试过程中,Spring Debugger 显示活动事务及其元数据——它是否处于活动状态、传播类型以及从哪里开始:

对于 JPA,它还显示了 L1 缓存,其中包含加载的实体,当我们遍历代码时,这些实体会被更新。有了这些信息,我们可以清楚地看到交易边界并发现违规行为。
如果事务处于活动状态,但数据仍未被持久化或正确加载,我们可以检查实体状态。
7. 检查JPA实体状态
在 JPA 中,实体状态很重要。实体是被管理、分离还是删除会影响级联、刷新操作和持久性上下文行为。
Spring Debugger 直接在调试器中显示实体生命周期状态。在任何断点处,我们都可以确认一个实体是否附加到当前会话:

当实体在服务之间传递时,此信息有助于调试服务层中与持久性相关的问题。
通过结合所有这些功能——bean 检查、属性跟踪、数据库连接检查、事务元数据和实体状态——我们可以全面了解应用程序在运行时发生了什么。
8. 结论
本文中,我们了解到调试 Spring Boot 通常意味着回答有关配置、连接、事务和持久性的问题。
Spring Debugger 插件将这些答案直接带入调试器和编辑器:
- 立即查看加载的 bean 及其状态
- 从应用上下文中调用任何 bean
- 追踪任何属性值的真实来源
- 无需猜测即可查看活动数据库连接
- 一目了然地检查交易和实体状态
Spring Debugger 插件作为单独的插件交付,尚未与 IntelliJ IDEA 捆绑在一起。这背后的原因是插件开发人员不想依赖 IDEA 的发布周期,而是可以根据需要更新插件。
使用 Spring Debugger,运行时洞察成为我们正常调试流程的一部分。我们不再需要在日志、配置和数据库工具之间切换来了解发生了什么。我们需要的一切——从 bean 状态到事务细节——都在 IDE 中,帮助我们更快地解决问题。