Spring Boot 一个接口多个实现类如何注入 Autowired 和 Resource 注解的区别
一、问题描述
1、在看Spring源码时,可以看到一个类的顶层,都是接口,然后若干过类实现接口,那么一个接口被多个类实现,Spring在使用的时候,是如何区分实现类的呢?
二、开始测试
1、创建一个接口 UserService
public interface UserService {
boolean check(String name);
void init();
}
2、分别创建 UserServiceImpl 、PersonImpl 类实现 UserService 接口
3、在Controller中使用 @Autowired 注入 UserService 接口
@Autowired
private UserService userService;
4、报错信息如下:
Field userService in com.runcode.springboottourist.web.UserWebController required a single bean, but 2 were found:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
三、解决办法
1、办法一: 在UserServiceImpl 和PersonImpl 某个类上加注解 @Primary
2、办法二:增加注解 @Qualifier 注入指定实现类
@Qualifier(value = "personImpl")
@Autowired
private UserService userService;
3、办法三: 使用 @Resource 注解,注入指定实现类
@Resource(name = "personImpl")
private UserService userService;
四、总结
1、接口有多个实现类时,可以使用 @Autowired+@Qualifier 注入指定实现类。
2、也可以使用 @Resource 直接注入指定实现类 。
3、还可以使用 @Primary 在指定实现类上标记。
参考资料: @Autowired和@Resource的区别