为什么@Autowired装配的是接口,而不是实现类?
实际装配的是实现类,例子:<\bean id=“deptDao” class=“Spring.dao.impl.DeptImpl”>,只是id是接口的id,class还是具体实现类。
如下,一个接口可以有多个实现类。接口就类似与插座,后面想要接零线火线都是自己决定的。这样拓展性高。如果项目有多个实现的话,可以使用接口。
service层
public interface HumanService {
String getName();
}
@Service("teacherService")
public class TeacherServiceImpl implements HumanService {
@Override
public String getName() {
return "this is a teacher";
}
}
@Service("studentService")
public class StudentServiceImpl implements HumanService {
@Override
public String getName() {
return "this is a student";
}
}
Controller层
@Controller
public class HumanController {
@Autowired
@Qualifier("teacherService")
private HumanService teacherService;
@Autowired
@Qualifier("studentService")
private HumanService studentService;
@RequestMapping("/name")
public void getName(){
System.out.println(teacherService.getName());
System.out.println(studentService.getName());
}
}
第二种解释:
引用:
Spring鼓励应用程序的各个层以接口的形式暴露功能,在Service层,可以使用Service接口 + ServiceImpl 实现类,也可以使用Service 实现类,但考虑到 “ 接口是实现松耦合的关键 ” ,所以更加推荐使用 Service接口 + ServiceImpl 实现类的方式来写 Service 层代码。
但是个人感觉,真正解决松耦合的是IOC/DI,而不是在于使不使用接口。使用DI,让Controller层与Service层【层与层】之间的耦合程度大大降低。即使不去new一个对象,Controller层中也会有Service层的依赖。