创建接口IOne和实现接口IOne的类OneImpl和OneTwoImpl
通过@Autowired注解,它会根据类型或者名称找到对应的Bean进行注入,如果不能区别就会报错
IOne 接口如下
package com.sboot.pr.service;
public interface IOne {
public String getInfo();
}
OneImpl类如下
package com.sboot.pr.service.impl;
import org.springframework.stereotype.Component;
import com.sboot.pr.service.IOne;
@Component
public class oneImpl implements IOne {
@Override
public String getInfo() {
return "OneImpl";
}
}
OneTwoImpl如下
package com.sboot.pr.service.impl;
import org.springframework.stereotype.Component;
import com.sboot.pr.service.IOne;
@Component
public class oneTwoImpl implements IOne {
@Override
public String getInfo() {
// TODO Auto-generated method stub
return "OneTwoImpl";
}
}
注入Bean,如果@Autowired 对应Bean不是唯一则会报错
package com.sboot.pr.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.sboot.pr.bean.BeanPOJO;
import com.sboot.pr.bean.ComponentPOJO;
import com.sboot.pr.bean.ComponentScanPOJO;
import com.sboot.pr.service.IOne;
import com.sboot.pr.service.impl.Two;
@RestController
public class TestController {
@Autowired
private IOne one;
@GetMapping("/boot/getOneInfo")
public String getoneInfo() {
return one.getInfo();
}
}
报错:Field one in com.sboot.pr.controller.TestController required a single bean, but 2 were found:
- oneImpl: defined in file [F:projecteclipse-workspacesboottargetclassescomsbootprserviceimplOneImpl.class]
- oneTwoImpl
解决方法
第一种方法:添加@Primary 注解,修改优先权的作用,比如在OneTwoImpl中添加注解,再次启动项目进行测试。
@Component
@Primary
public class oneTwoImpl implements IOne {
启动项目进行访问
http://localhost:1111/boot/getOneInfo
第二种方法:添加@Qualifier注解与@Autowired 组合,则会通过类型和名称去找到Bean,可以消除歧义性
@Autowired
@Qualifier("oneImpl")
private IOne one;
启动项目进行访问
第三种方法:通过@Autowired注解,它会根据类型或者名称找到对应的Bean进行注入
@Autowired
private IOne oneTwoImpl;
启动项目进行访问



