在微服务项目中,相互依赖的两个微服务同时实现了某个Configuration,导致出现以下报错信息:
Error creating bean with name 'singerService': Unsatisfied dependency expressed through field 'singer'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.xcc.config.Singer' available: expected single matching bean but found 2: MetalSinger,OperaSinger
复现源码为:
/*接口*/
public interface Singer {
String sing(String lyrics);
}
实现类1:
@Configuration("MetalSinger")// 加注解,让spring识别
public class MetalSinger implements Singer{
@Override
public String sing(String lyrics) {
return "I am singing with MetalSinger voice: "+lyrics;
}
}
实现类2:
@Configuration("OperaSinger") // 加注解,让spring识别
public class OperaSinger implements Singer {
@Override
public String sing(String lyrics) {
return "I am singing in OperaSinger voice: "+lyrics;
}
}
注入端:
@Component
@Data
public class SingerService {
@Autowired
private Singer singer;
public String sing(){
return singer.sing("song lyrics");
}
}
解决方式: 使用@Primary
在其中一个实现类上使用:@Primary
@Configuration("MetalSinger")// 加注解,让spring识别
@Primary
public class MetalSinger implements Singer{
@Override
public String sing(String lyrics) {
return "I am singing with MetalSinger voice: "+lyrics;
}
}
运行结果:I am singing with MetalSinger voice: song lyrics
特殊场景:
实现类1使用了@Primary 注解,但是还是想要使用实现类2,查看spring文档可见:
@Qualifier 可以指定注入bean。
注入端代码加入@Qualifier
@Component
@Data
public class SingerService {
@Autowired
@Qualifier("OperaSinger")
private Singer singer;
public String sing(){
return singer.sing("song lyrics");
}
}
在实现类有@Primary注解的前提下,仍然走了 @Qualifier("OperaSinger")指定的实现类。
运行结果: