@Autowired注解在实现类还是接口
首先要清楚@Service是注解在实现类上的,@Service告诉Spring容器,注册一个实例化的类对象,当@Service注解在接口上,是无法对接口实例化的。
@Service
public class xxxImpl implements xxxService
@Autowired本质上注入的也是实现类,但是是根据接口byType的方式寻找接口的实现类,将其注入,所以在形式上@Autowired作用在接口上,换句话说是创建了实现类的对象但引用了接口类型。因为存在多类继承一个接口的情况,若@Autowired直接注解于接口实现类,不利于降低类型之间耦合性,与Spring理念相悖。
@Autowired
private xxxService xxxservice;
- 若SmsService接口有2个实现类:
SmsServiceImpl1
和SmsServiceImpl2
//@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;
标签:Service,Autowired,SmsService,接口,注解,public
From: https://www.cnblogs.com/chuimber/p/17771510.html