报错如下
原因:当@MapperScan和@ComponentScan一起使用时,项目启动时扫描包会发生冲突,找不到swagger配置类的包和mapper接口的包
解决办法:@MapperScan和@ComponentScan可以一起使用。
改为@MapperScan(basePackages = {})的形式。
或者只使用@MapperScan()去扫描mapper包,让项目启动自己去扫描swagger配置类的包
课外拓展:
@MapperScan
1.首先了解@Mapper
在持久层的接口上添加@Mapper注解,编译后会生成相应的接口实现类,但由于要在每个接口上都进行配置,所以产生了@MapperScan。
2.@MapperScan
指定要编译成接口实现类的包路径,在编译完成后这个包下的所有接口都会生成相应的接口实现类。
@ComponentScan
1.会自动扫描包路径下的@Controller、@Service、@Repository、@Component类,符合扫描规则的类会装配到spring容器中。
2.@MapperScan和@ComponentScan可以同时使用
如果@MapperScan和@ComponentScan扫描的是同一路径会产生错误,所以
@MapperScan(basePackages = { "com" })
@SpringBootApplication
项目场景:
最近在使用SpringBoot搭建项目,使用了Mybatis的generator自动生成mapper和mapper.xml。在mapper注入的时候,发现自己对mapperscan、mapper、componentscan注解的理解不是很深入,因此,在这里记录一下。
问题描述:
SpringBoot项目启动后,发现mapper并没有注入到容器中。分析原因是在mapper类中少加了mapper注解,或者是主启动类中没有加mapperscan注解。其实归根结底还是因为对于这三个注解理解不深。
三种注解区别:
@ComponentScan注解
ComponentScan就是告诉Spring从哪里找到bean Spring会在应用主程序所在的包及其子包下进行全局扫描,把对应的bean注入到容器中,这里面的bean包括service mapper resposioty controller 所以在springboot程序中如果有mapper注解的话 就不用再加mapperscan注解,springboot注解自带componentscan,会扫描到。
@MapperScan注解
@Mapper注解可以在编译之后生产对应的接口实现类,如果要每个接口都编程实现类,需要在每个接口上加上Mapper注解,比较麻烦,解决这个问题用的是@MapperScan注解,mapperscan注解后面可以加value指定要扫描的包,即可实现mapper的注入。
其实MapperScan完成了两件事情:
根据配置的路径进行mapper.java的扫描 此处扫描到的就是mapper下的java文件为扫描到的mapper进行注册BeanDefinition。