zeus00456

导航

变更 Springboot 的启动类位置后,无法自动扫描 mapper 的原因

前言

这个帖子一个 EGG_ACHE 的人遇到了一个 EGG_ACHE 的问题,经过了一系列 EGG_ACHE 的努力后最终 EGG_ACHE 的故事
这个最开始的 Mapper 为啥找不到的问题本身不值一提
重点是后面的衍生问题和尝试处理它的过程,最后因为作者的不甘心才发泄式的怼出这么个帖子
所以这里要说的是 如果你对这个衍生问题不感兴趣,就不要看了

场景

以前在项目中,一向喜欢 @Mapper 和 @MapperScan 一起使用(实际上,大部分团队都是混用的,项目越老越如此)
后来仔细扫盲时才知道理论上二者用其一即可,但因为在项目上就没有随便尝试(幸亏)
再后来,闲着 EGG_ACHE 了,尝试干掉了 @MapperScan ,万幸——项目挂了。
挂的姿势如下图
在这里插入图片描述
直到前段时间,作者又想起这个问题,再次和它纠结

原因和衍生问题

经过了漫长的排查和分析(xia jb 试),最终定位问题为 我改了启动类的位置
依据是:把启动类放到默认的位置上,一切都正常了
不要纠结“为什么你非要变更启动类的位置”这种一两句话作者解释不清的问题上
让我们关注一个问题:为什么启动类位置一变,mapper就挂了

mapper是怎么没的

首先,作者的启动类位置如图
在这里插入图片描述
通过跟踪代码可以看到springboot启动时,会执行两次doScan,
第一次位置如图,可以看到是由spring执行的
在这里插入图片描述
第二次位置如图,可以看到是mybatis-spring执行的
在这里插入图片描述
第一次用于扫描spring相关component,从下图我们可以看到他的基础路径是我们预期的
在这里插入图片描述
它的基础路径是从启动类上通过注解拔下来的,这里的代码是上图代码往前找两次调用
在这里插入图片描述
而第二次扫描的basepackage,理所当然的错了,它从这里进行获取
在这里插入图片描述
获取时通过下图这样的逻辑
在这里插入图片描述
在这里插入图片描述

最终从这里获取
在这里插入图片描述
而这个位置,是由下面的注解自动扫描并填装的,这个注解被启动类上的 @SpringBootApplication携带
在这里插入图片描述
换句话说,mybatis无法使用scanBasePackage作为扫描根路径,只能以启动类所在的目录开始扫描
它并没有按照springboot的方式确定basepackage,这就是为什么别的类都照常,就mapper挂了的原因

posted on 2022-07-28 16:02  问仙长何方蓬莱  阅读(357)  评论(0编辑  收藏  举报