测试中发现代码中一个接口的多个实现,注解有误,造成错误
原始代码如下
接口:
public interfaceIPrcCataDataSource {}
接口实现类1:
@Component
public class HotPgPrcDataSource implements IPrcCataDataSource{}
接口实现类2:
@Component
public class PgCalPrcDataSource implements IPrcCataDataSource{}
调用接口实现类1:
public classLcHotPgPrcQryBuild {
@Autowired
protected IPrcCataDataSource prcCataDataSource;
}
报错信息:
Description:
Field prcCataDataSource incom.sitech.pgcent.local.LcHotPgPrcQryBuild required a single bean, but 2 werefound:
-
Action:
Consider marking one of thebeans as @Primary, updating the consumer to accept multiple beans, or using@Qualifier to identify the bean that should be consumed
报错原因:
@Autowired 注解的注入规则:
经过一些代码的的测试,Autowired默认先按Type,如果同一个Type找到多个bean,则,又按照Name方式比对,如果还有多个,则报出异常。
解决方法:
方式1:
在Autowired 下面加入注解@Qualifier
, @Qualifier 是按照Name方式比对, @Qualifier()中的值是需要注入的类的名称,默认为注入类名第一位小心的形式,或者也可以在实现类中加入@Service(定义类注入名称) 注解,
@Autowired
@Qualifier
("hotPgPrcDataSource")
protected IPrcCataDataSource prcCataDataSource;
方式2:直接加入@Resource注解,name 值是需要注入的类的名称,默认为注入类名第一位小心的形式
@Resource(name = "hotPgPrcDataSource")
protected IPrcCataDataSource prcCataDataSource;