問題
以Ruoyi-Vue
項目為例,以Debug
方式啟動項目,在com.ruoyi.web.controller.system.SysUserController#list()
方法中的userService.selectUserList(user)
處打上斷點,訪問[系統管理–用戶管理]頁面,程序就會執行到該斷點處
此時按下"步入"(F5),發現并不是直接進入業務方法SysUserServiceImpl#selectUserList()
,而是進入了Spring
框架的org.springframework.aop.framework.CglibAopProxy#intercept()
方法
原因:Spring 框架使用動態代理(如 CGLIB 或 JDK Proxy)處理 AOP 切面,導致調試器優先進入框架層。
此時可以在調用棧中往下找到對UserServiceImpl#selectUserList()
方法的調用,單擊它,就會跳轉到對應方法上,在該方法第一行打上斷點
按下"恢復程序"(F8),就會執行到該斷點處
可是這種方式的痛點是:每次還是會進入Spring
框架的類,然后需要手動從調用棧跳轉到業務方法上,并且一般一個項目都有很多Service
接口,每次都這么操作的話就很麻煩,效率非常低下,會顯著降低調試速度。
分析
通過IDE
(如 IntelliJ IDEA
)的調試器設置,配置調試器不進入特定類,可以跳過指定包下的所有類,這樣就一勞永逸地避免調試時進入 Spring
框架層,直接聚焦業務邏輯。
解決
打開[設置–構建、執行、部署–調試器–步進],勾選"不要進入類",點擊"+“號,選擇[添加類],或選擇[添加模式],第一種是指定某一個具體類,而第二種可以使用”*"進行模糊匹配
這里使用[添加模式],輸入org.springframework.*
(表示不進入org.springframework
包及其子孫包下的所有類),點擊[確定],再以同樣步驟添加org.aspectj.*
此設置對所有調試會話生效,無需重復配置。
此時可以看到列表中多了org.springframework.*
和org.aspectj.*
,點擊[應用]–[確定]
再次訪問[系統管理–用戶管理]頁面,程序再次執行到com.ruoyi.web.controller.system.SysUserController#list
方法的斷點處
此時按下"步入"(F5),就不會進入匹配到org.springframework.*
和org.aspectj.*
的類,而是直接執行到com.ruoyi.framework.aspectj.DataScopeAspect#doBefore
(這是Ruoyi
項目自定義的AOP
類)
如果項目中使用了其他框架(如Hibernate
或MyBatis
),可以類似添加模式(如org.hibernate.*
或org.apache.*
)。這能進一步減少干擾。
總結
通過配置“調試器不進入特定類”模式,能一勞永逸地避免調試時進入框架層,直接聚焦業務邏輯。這在大項目中尤為實用,能顯著提升調試效率。