1. 简介

Spring Boot 通过包含少量依赖和最少配置,使创建强大的应用程序变得容易。我们只需几行代码,就可以设置 HTTP 端点、连接到数据库并处理事件。这感觉就像魔法——直到出现问题。

当出现问题时,调试变得至关重要。然而,理解 Spring Boot 应用程序背后的运作方式可能很棘手。配置值可能来自多个来源,bean 可能会有条件地加载,并且事务问题可能难以确定。

在弄清楚一个问题时,我们经常会问自己以下问题

  • 实际使用了哪个属性值?
  • 注入了哪个 bean?
  • 当前事务是否处于活动状态?
  • 应用程序连接到哪个数据库?

在本教程中,我们将探讨 Spring Debugger 插件如何为 IntelliJ IDEA 添加 Spring 特定的见解到标准调试器,并简化应用程序故障排除。

2. Spring Debugger 入门

Spring Debugger 不需要特殊配置——只需安装插件并在调试模式下运行应用程序。

它适用于以下运行配置类型

  • 原生 IntelliJ IDEA Spring Boot
  • Maven spring-boot:run 命令
  • Gradle bootRun 任务
  • 截至 2025 年 8 月,远程附加仍不支持。

该插件与 IDE 内置调试器 API 集成,无需使用 Spring Boot Actuator 或其他额外的库或代理即可工作。

安装后,我们可以立即开始使用其所有功能来探索应用程序在运行时内部发生的事情——从 beans 开始。

3. 查看运行时加载的 Beans

当我们开始调试 Spring 应用时,首先想知道的问题之一是:实际加载了哪些 beans?

Spring Debugger 在 Project 视图中为 bean 提供特定图标(按 bean 类型区分):

Project view with loaded beans indicators

如示例所示,我们有

  • 绿色表示已加载的 beans
  • 灰色表示已扫描但未加载的 beans
  • 橙色表示模拟的 beans

这种视觉反馈在测试或可用多个实现时尤其有用。我们还可以评估当前应用程序上下文中的任何 Spring bean。在 Evaluate Expression 窗口中,自动补全可以帮助我们直接在 beans 上调用方法——无需更改代码或重启。

了解了加载的 beans 后,下一个挑战通常是弄清楚为什么应用程序的行为与我们预期的不同——而这通常从配置开始。

4. 查找任何属性的实际值

Properties 的行为并不总是如预期那样——它们的值可能取决于活动配置和应用顺序,或者来自外部来源,例如环境变量或配置服务。

Spring Debugger 在配置文件中内联显示有效的属性值。点击它会导航到提供该值的来源,无论它是文件还是 Java 代码

application.properties file with actual config values in inlays

在调试会话期间,我们可以在 Evaluate Expression 窗口中评估属性。在这种情况下,我们可以看到值,以及来源,并且调试器会显示更新值的堆栈跟踪。

对于环境变量、系统设置或配置服务器,即使无法导航,IDE 也会清晰地描述来源

The debugger evaluation panel with property data
在确认配置正确后,故障排除的另一个常见步骤是确保应用程序已连接到正确的数据库。

5. 立即检查数据库连接

运行集成测试时,应用程序连接到哪个数据库并不总是显而易见的——特别是使用 Testcontainers 等工具时,端口和凭据可能会发生变化。

Spring Debugger 与 Database 工具窗口集成,以显示运行时活动的连接。我们可以探索连接容器或独立数据库中的数据,而无需猜测连接字符串或扫描日志

Active database connection indicator in the Database toolwindow

对于内存数据库,Spring Debugger 会显示连接,但无法显示架构或数据,因为这些数据库仅存在于应用程序进程内部,并且无法通过 IDE 的 JDBC 驱动程序在没有专用端点的情况下访问。在这种情况下,我们可以暂停应用程序并使用 beans——repository、entityManager 或直接获取连接对象来执行 SQL 或 JPQL 查询。

即使数据库连接正确,由于事务处理,仍然可能出现问题——而这些问题的诊断可能更加棘手。

6. 诊断事务问题

一个常见的 Spring 错误是 LazyInitializationException,当我们在活动事务之外访问 JPA 实体时会发生这种情况。

在调试期间,Spring Debugger 显示活动事务及其元数据——是否活动、其传播类型以及事务的启动位置

Automatic transaction indicator in the debugger toolwindow

对于 JPA,它还会显示 L1 缓存中加载的实体,这些实体在我们单步执行代码时会更新。有了这些信息,我们可以清楚地看到事务边界并发现违规行为。

如果事务处于活动状态但数据仍然无法正确持久化或加载,我们可以检查实体状态。

7. 检查 JPA 实体状态

在 JPA 中,实体状态很重要。实体是托管、分离还是已删除,会影响级联、刷新操作和持久化上下文行为。

Spring Debugger 直接在调试器中显示实体生命周期状态。 在任何断点处,我们可以确认实体是否附加到当前会话

Debugger tool window showing JPA entity states

这些信息在调试服务层中的持久化相关问题时很有帮助,特别是当实体在服务之间传递时。

通过结合所有这些特性——bean 检查、属性追踪、数据库连接检查、事务元数据和实体状态——我们可以全面了解应用程序在运行时发生的情况。

8. 结论

在本文中,我们了解到调试 Spring Boot 通常意味着回答关于配置、依赖注入、事务和持久化的问题。

Spring Debugger 插件将这些答案直接带入调试器和编辑器

  • 立即查看已加载的 bean 及其状态
  • 调用应用程序上下文中的任何 bean
  • 追踪任何属性值的真实来源
  • 无需猜测即可查看活动数据库连接
  • 一目了然地检查事务和实体状态

Spring Debugger 插件作为单独的插件交付,尚未捆绑在 IntelliJ IDEA 中。 其背后的原因是插件开发者不想依赖 IDEA 的发布周期,而是可以根据需要更新插件。

有了 Spring Debugger,运行时洞察力成为我们正常调试流程的一部分。 我们不再需要在日志、配置和数据库工具之间切换来了解正在发生的事情。 我们所需的一切——从 bean 状态到事务细节——都位于 IDE 中,帮助我们更快地解决问题。

8 条评论
最早
最新
内联反馈
查看所有评论
© .