Spring Boot 一个接口多个实现类如何注入 Autowired 和 Resource 注解的区别

        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的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值