问题:单独使用@repository注解注dao层,而且不使用@mapperscan扫描时,启动项目会报错:
Field xxxxMapper in com.sms.shiro.service.impl.xxxxServiceImpl required a bean of type ‘com.sms.shiro.mapper.xxxxMapper’ that could not be found.
在这里插入图片描述 一,@mapper和@repository的区别:
1.@mapper是mybatis的注解,@repository是spring家族的注解。
2.使用@mapper注解时,spring并不认识,@autowired注入到service里的mapper会爆红。

二,回到问题中来,明明springboot里的ComponentScan扫描了启动器包下的所有含注解的组件,那为什么却找不到@repository的组件?
原因:造成这个问题的原因是因为springboot在扫描时候自动过滤掉了接口和抽象类,所以@repository修饰的mapper接口并不能称为一个bean,自然也就无法注入到service中。

三,解决方式:

第一种: 不使用@repository,在mapper层接口直接使用@mapper,但如果项目工程较大的话就会很麻烦。

第二种: 如果想使用@repository,因为springboot无法扫描到mapper接口,则在启动器上使用@mapperscan扫描所有mapper接口的包,如:@MapperScan("com.sms.shiro.*.mapper")

第三种: 其实使用@mapperscan注解扫描mapper接口后,mapper接口就不需要@repository和@mapper去注册bean了,但如果想项目结构比较明了,在使用了@mapperscan扫描后,@repository和@mapper都可使用,都不会报错了,但是使用@repository会解决在service中@autowired mapper爆红的问题。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐