springboot使用ComponentScan和MapperScan
今天讲springboot项目中的启动类换到了start包下,发现无法扫描并注册javabean.
原因:
容器在启动时会由spring.classPathBeanDefinitionScanner和spring-mybaits.classPathMapperScanner两个类去分别执行doScan方法,如果没有使用@ComponentScan和MapperScan两个注解
spring会使用SpringBootApplication注解中的compontScan的扫描路径 默认扫描路径是启动类所在包下
spring-mybaits会扫描SpringBootApplication注解中的EnableAutoConfiguration注解所在类的包下(也就是启动类包下)
因此需要扫描的组件所在包如果不放在启动类所在包下,则必须使用ComponentScan和MapperScan才能被扫描到生成实例让spring容器管理
可以使用
@MapperScan(value="com.**.dao") 只对dao包下的持久层对象创建mapper对象
@MapperScan会对扫描包下的所有接口都生成为mapper对象,导致非持久层mapper对象也生成,导致javabean重复,注入失败。报错见下图(IPersonService接口也被生成为mapper对象了)
如果只使用compontScan注解而不使用mapperscan注解 则mybatis无法生成对应的mapper实例对象 导致注入失败 报错原因如下 (因为spring-mybatis扫描时的根路径是
SpringBootApplication注解中的EnableAutoConfiguration注解所在类的包下,所以成功生成mapper对象,导致注入失败
)
两次扫描的代码(https://www.cnblogs.com/zeus00456/p/16528993.html)
分类:
spring-boot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人