解决报错问题
错误信息Considermarkingoneofthebeansas@Primary,updatingtheconsumertoacceptmultiplebeans,orusing@Qualifiertoidentifythebeanthatshouldbeconsumed
问题原因——多个类实现同一接口
先看代码根据上面错误信息再结合代码,可以看出问题就是:同一个接口PetInterface有两个实现类,而我们的Spring并不知道应当引用哪个实现类
解决问题
那么上述问题怎么解决呢?当然简单粗暴的方法不是不可以——直接删除一个实现类,删除之后,Spring会自动去对应包下寻找PetInterface接口的实现类,发现PetInterface接口只有一个实现类,便会直接引用这个实现类。删除的前提是你没有别的需求。如果非留不可,也不是不能解决,请往下继续……
方案用注解@Qualifier
代码实现
注意是@Autowired与@Qualifier二者结合使用,不要漏掉其中一个
@Qualifier('dogPlays' )
@Autowired
private PetInterface petInterface;
@Qualifier('catPlays' )
@Autowired
private PetInterface petInterface2;
看我们的idea智能的过分,哈哈挺好
需要注意点@Service
需要注意的是:如果实现类里,注解@Service没有指定实现类的bean名称,则注入的时候默认用该实现类首字母小写的bean的名字如果用注解@Service(“dog”)指定了实现类的bean名称,则用注解@Qualifier(“dog”)注入的时候,注意名称保持一致具体如下:
@Autowired
@Qualifier('dog')
private PetInterface petInterface;
@Autowired
@Qualifier('catPlays')
private PetInterface petInterface2;
@Autowired简单理解
@Autowired为Spring提供的注解,需要导入包orspringframeworbeans.factory.annotatioAutowired@Autowired注释,它可以对类成员变量、方法及构造函数进行标注,让spring完成bean自动装配的工作。@Autowired默认是按照类型去匹配注入,配合@Qualifier按照指定的name名称去装配bean。
方案2——用注解@Resource
代码实现
用注解@Resource(name='')或@Resource(type=)替换@Autowired、@Qualifier这两个组合注解
@Resource(name = 'dogPlays')
private PetInterface petInterface;
@Resource(name = 'catPlays')
private PetInterface petInterface2;
或者:
@Resource(name = 'dogPlays')
private PetInterface petInterface;
@Resource(type = CatPlays.class)
private PetInterface petInterface2;
需要注意点@Service
参考方案1中的需要注意点
@Resource简单理解
文章为作者独立观点,不代表观点