现在的IDEA基本上是开发工具标配了,在开发中有许多坑需要填,最近遇到一个有Mybatis Mapper自动注入警告问题,现在这里记录一下。

问题:
在serviceImpl中,我们都会写这样的代码在这里插入图片描述
然后会看到我们注入的mapper下面IDEA报红了,但是代码本身并没有问题,能正常运行,但这个警告有点恶心,强迫症表示受不了。

原因:
IDEA它可以理解Spring的上下文,然而 xxxMapper 这个接口是Mybatis的,IDEA理解不了。
而 @Autowired 注解,默认情况下要求依赖对象(也就是 xxxMapper )必须存在。而IDEA认为这个对象的实例/代理是个null,所以就友好地给个提示。

解决:【这里我写了一个我喜欢的方式】
在Mapper接口上加上@Repository注解
在这里插入图片描述
当然,如果用@Component替换@Repository也是可以的。原理大致:IDEA不是认为 xxxMapper 是个null嘛…加个@Repository注解骗一下IDEA就OK

扩展:
1.关于mybatis的mapper扫描,一般也可以在springboot启动类上来个@MapperScan注解,这样不用每个mapper接口都要加@Mapper注解了
在这里插入图片描述
2.@Mapper 是 Mybatis 的注解,和 Spring 没有关系,@Repository 是 Spring 的注解,用于声明一个 Bean。

3.@Mapper 一定要有,否则 Mybatis 找不到 mapper。
@Repository 可有可无,可以消去依赖注入的报错信息。
@MapperScan 可以替代 @Mapper。

4.关于@Autowired与@Resource的区别
@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。
@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
@Resources按名字,是JDK的,@Autowired按类型,是Spring的。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐