王磊的个人技术记录 王磊的个人技术记录

记录精彩的程序人生

目录
mybatis bean冲突
/    

mybatis bean冲突

问题:

启动报错***有两个bean实例被定义,打印出来的路径一个是实现类,一个是接口。实际这个接口只有一个实现类,用的是@Autowired注解,正常情况下当接口只有一个实现类时,该实现类作为一个bean实例被注入到ioc容器中。

原因:

Mapperscan扫描范围,包含了这个接口,接口被扫描到时 mabits 会把这个包的的接口以及子包的接口通通生成一个代理类注入都 IOC 容器中,key 就是接口的名字,而真正的实现类也会被装载到 IOC 容器中,实现类首字母小写就是 IOC 的 key ,这时就有两个实现类了,通过 @Autowired 注入的 Bean 就不知道找那个 bean 了

.解决办法:
1)可以修改MapperScan扫描范围,使范围只包含mybits的mapp文件。
2)指定注入bean的bean名;

@Autowired 注解的注入规则:
经过一些代码的的测试,Autowired默认先按Type,如果同一个Type找到多个bean,则,又按照Name方式比对,如果还有多个,则报出异常。

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


标题:mybatis bean冲突
作者:wangduidui
地址:https://wangleijava.com/articles/2023/09/09/1694231906274.html