- 报错信息展示:
- 项目背景:
- 报错还原:
- 原因分析:
- 解决方案:
- 方案一:使用@Qualifier注解来指明注入的实例。
- 方案二:使用@Resource(name="Xxxservice")注解来指明注入的实例。
- 补充说明:
- 拓展:@AutoWired、@Resource、@Qualifier理解
Error creating bean with name '***ManagementController': Unsatisfied dependency expressed through field '***Service'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.***.***.service.***Service' available: expected single matching bean but found 2: ***ServiceImpl,***ServiceImpl项目背景:
基础的SSM框架项目。
报错还原:实现类A
@Service
public class AxxxServiceImpl implements AxxxxService {
}
实现类B
@Service
public class BxxxServiceImpl implements BxxxService {
}
controller中注入
@Controller
@RequestMapping("1")
public class XxxxController {
@Autowired
//@Qualifier(value = "BxxxServiceImpl")
private BxxxService bxxxService;
@Autowired
//@Qualifier(value = "AxxxServiceImpl")
private AxxxService axxxService;
@RequestMapping("/1")
@ResponseBody
private Map getXxxxInfo(){
// 略去
}
然后启动服务,访问后报错,信息如下:
Error creating bean with name '***ManagementController': Unsatisfied dependency expressed through field '***Service'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.***.***.service.***Service' available: expected single matching bean but found 2: ***ServiceImpl,***ServiceImpl原因分析:
当一个接口实现,由两个实现类时,只使用@Autowired注解,会报错。
原因是存在两个实例Aservice,Bservice,系统不知道注入哪个一个实例。
解决方案: 方案一:使用@Qualifier注解来指明注入的实例。@Controller
@RequestMapping("1")
public class XxxxController {
@Autowired
@Qualifier(value = "BxxxServiceImpl")
private BxxxService bxxxService;
@Autowired
@Qualifier(value = "AxxxServiceImpl")
private AxxxService axxxService;
@RequestMapping("/1")
@ResponseBody
private Map getXxxxInfo(){
// 略去
}
方案二:使用@Resource(name=“Xxxservice”)注解来指明注入的实例。
@Controller
@RequestMapping("1")
public class XxxxController {
@Resource(name="BxxxServiceImpl")
private BxxxService bxxxService;
@Resource(name="AxxxServiceImpl")
private AxxxService axxxService;
@RequestMapping("/1")
@ResponseBody
private Map getXxxxInfo(){
// 略去
}
补充说明:
网上还有说需要在实现类中加入注解@Component(value="XxxxServiceImpl ")才能实现,就我的解决过程中,以上步骤为止就已经解决问题了。
实现类A
@Component(value="AxxxServiceImpl ")
public class AxxxServiceImpl implements AxxxxService {
}
实现类B
@Component(value="BxxxServiceImpl ")
public class BxxxServiceImpl implements BxxxService {
}
拓展:@AutoWired、@Resource、@Qualifier理解
资料参考链接:
@Autowired注解与@Qualifier注解搭配使用.



