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)

 

 

posted on 2024-06-10 19:34  丶柚子  阅读(285)  评论(0)    收藏  举报

导航