mybatis遇到的坑——bean冲突

1.启动报错说这里fvFileCheckInfoDao有两个bean实例被定义,这个接口只有一个实现类,用的是@Autowired注解,正常情况下当接口只有一个实现类时,该实现类作为一个bean实例被注入到ioc容器中。
@Autowired 注解的注入规则:
经过一些代码的的测试,Autowired默认先按Type,如果同一个Type找到多个bean,则,又按照Name方式比对,如果还有多个,则报出异常。

@Resource注解的注入规则:
默认按byName自动注入。
它有两个关键的属性:name-名称,type-类型
如果指定了name,type,则从Spring容器中找一个名称和类型相当应的一个bean,找不到则报错。
如果只指定了name,则从Spring容器中找一个名称和name一样的bean,找不到则报错
如果只指定了type,则从Spring容器中找一个类型和type一样的bean,找不到或者找到多个则报错。
如果没有指定参数,则默认找字段名称装配,找不到则按类型装配,找不到则报错。

在这里插入图片描述
2.原因是Mapperscan扫描范围,当一个接口被扫描到时,这时 mabits 会把这个包的的接口以及子包的接口通通生成一个代理类注入都 IOC 容器中,key 就是接口的名字,而真正的实现类也会被装载到 IOC 容器中,实现类首字母小写就是 IOC 的 key ,这时就有两个实现类了,通过 @Autowired 注入的 Bean 就不知道找那个 bean 了,
在这里插入图片描述
3.解决办法:
1)可以修改MapperScan扫描范围,由于本项目其他需求,暂不修改该配置。
2)所以使用@Resource注解注入该接口并通过name指定其实现类;
在这里插入图片描述
实现类上加上名字,这样注入的只有该实现类了。
在这里插入图片描述

Logo

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

更多推荐