问题
以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.*
)。这能进一步减少干扰。
总结
通过配置"调试器不进入特定类"模式,能一劳永逸地避免调试时进入框架层,直接聚焦业务逻辑。这在大项目中尤为实用,能显著提升调试效率。