@Autowired注解在实现类还是接口

发布时间 2023-10-18 10:41:19作者: 小臣敲键盘

@Autowired注解在实现类还是接口

首先要清楚@Service是注解在实现类上的,@Service告诉Spring容器,注册一个实例化的类对象,当@Service注解在接口上,是无法对接口实例化的。

@Service
public class xxxImpl implements xxxService

@Autowired本质上注入的也是实现类,但是是根据接口byType的方式寻找接口的实现类,将其注入,所以在形式上@Autowired作用在接口上,换句话说是创建了实现类的对象但引用了接口类型。因为存在多类继承一个接口的情况,若@Autowired直接注解于接口实现类,不利于降低类型之间耦合性,与Spring理念相悖。

@Autowired
private xxxService xxxservice;
  • 若SmsService接口有2个实现类:SmsServiceImpl1SmsServiceImpl2
//@Service按名称注解多个实现类有两种方式
@Sercive("smsServiceImpl1")
public class smsServiceImpl implements SmsService;
@Sercive("smsServiceImpl2")
public class smsServiceImpl implements SmsService;
//或者
@Sercive
public class smsServiceImpl1 implements SmsService;
@Sercive
public class smsServiceImpl2 implements SmsService;
-----------------------------------------------------
// 报错,byName 和 byType 都无法匹配到 bean
@Autowired
private SmsService smsService;

// 正确注入 SmsServiceImpl1 对象对应的 bean
@Autowired
private SmsService smsServiceImpl1;
	
// 正确注入  SmsServiceImpl1 对象对应的 bean
// smsServiceImpl1 就是我们上面所说的名称
@Autowired
@Qualifier(value = "smsServiceImpl1")
private SmsService smsService;