1. 簡介
Spring Boot 使得通過包含少量依賴項和最小配置,輕鬆創建強大的應用程序。只需幾行代碼,我們就可以設置 HTTP 端點、連接到數據庫以及處理事件。這感覺就像魔法——直到出現問題。
當問題出現時,調試就變得至關重要。但是,理解 Spring Boot 應用程序背後的運行機制可能會很棘手。配置值可能來自多個來源,Bean 可能會在條件下加載,事務問題也難以定位。
在解決問題時,我們是否經常會問自己以下問題:
- 實際使用的屬性值是什麼?
- 哪個 Bean 被注入了?
- 當前事務是否處於活動狀態?
- 應用程序連接到哪個數據庫?
在本教程中,我們將探索 Spring 調試器 插件如何為 IntelliJ IDEA 添加 Spring 相關的見解,並簡化應用程序的故障排除。
2. 使用 Spring Debugger 入門
Spring Debugger 不需要進行任何特殊配置,只需安裝插件並以 調試 模式運行應用程序。
它支持以下運行配置類型:
- Native IntelliJ IDEA Spring Boot
- Maven spring-boot:run 命令
- Gradle bootRun 任務
- 遠程附加目前不受支持(截至 2025 年 8 月)
該插件與 IDE 內置的調試器 API 集成,無需使用 Spring Boot Actuator 或其他額外的庫或代理即可工作。
安裝後,我們就可以立即開始使用其所有功能,以探索在運行時應用程序內部發生的情況,從 Bean 開始。
3. 查看運行時加載的 Bean
當開始調試 Spring 應用時,首要問題是:哪些 Bean 實際被加載了?
Spring Debugger 會為 Project 視圖添加 Bean 級別的圖標(根據 Bean 類型區分):
如示例所示,我們有:
- 綠色表示已加載的 Bean
- 灰色表示已掃描但未加載的 Bean
- 橙色表示模擬的 Bean
這個視覺反饋在測試或多個實現方案可用時尤其有用。 我們還可以從當前應用程序上下文評估任何 Spring Bean。 在 Evaluate Expression 窗口中,自動補全功能可以幫助我們直接調用 Bean 中的方法——無需修改代碼或重啓。
一旦我們知道哪些 Bean 被加載了,下一個挑戰通常是找出應用程序的行為與預期不符的原因——這通常與配置有關。
4. 確定任何屬性的真實值
屬性有時不會表現出預期的行為——它們的取值可能取決於活動配置文件以及它們的應用程序順序,也可能來自外部源,例如環境變量或配置服務。
Spring Debugger 在配置文件的內聯顯示 有效屬性值。 單擊它會導航到提供該值的源,無論它是否為文件或 Java 代碼:
在調試會話期間,我們可以通過 評估表達式 窗口來評估屬性。 在這種情況下,我們不僅可以看到值,還可以看到其來源,調試器還會顯示該值是如何更新的堆棧跟蹤。
對於環境變量、系統設置或配置服務器,即使無法導航,IDE 也會提供清晰的來源描述:
確認配置正確後,故障排除中常見的另一個步驟是確保應用程序連接到正確的數據庫。
5. 立即檢查數據庫連接
在運行集成測試時,可能並不清楚應用程序連接到哪個數據庫——尤其是在使用諸如 Testcontainers 之類的工具時,因為端口和憑據可能會發生變化。
Spring Debugger 與數據庫工具窗口集成,可在運行時顯示活動連接。我們可以探索連接的容器或獨立數據庫中的數據,而無需猜測連接字符串或掃描日誌:
對於內存數據庫,Spring Debugger 顯示連接,但無法顯示模式或數據,因為這些數據庫僅存在於應用程序進程內部,並且無法通過 IDE 的 JDBC 驅動程序訪問,除非有專門的端點。在這種情況下,我們可以暫停應用程序並使用 Bean(例如,Repository、EntityManager)或直接獲取連接對象來執行 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 捆綁(目前)。 這樣做是因為插件開發者不希望依賴 IntelliJ IDEA 的發佈週期,而是可以根據需要獨立更新插件。
藉助 Spring Debugger,運行時洞察力成為我們日常調試流程的一部分。 我們無需在日誌、配置和數據庫工具之間切換,才能瞭解發生了什麼。 我們需要的全部內容——從 Bean 狀態到事務詳情——都位於 IDE 中,幫助我們更快地解決問題。