我是spring Mvc新手,在很多教程中,我发现有一个像这样的Dao接口(interface)
public interface StudentDAO {
public List<Student> getStudents();
public void addEntry(Student student);
public void updateEntry(Student student);
public void deleteEntry(Student student);
public Student getStudentById(int id);
}
还有类似的服务
public interface StudentService {
public List<Student> getStudents();
public void addEntry(Student student);
public void updateEntry(Student student);
public void deleteEntry(Student student);
public Student getStudentById(int id);
}
这些接口(interface)都有实现。
我的问题是为什么我们需要接口(interface)而不是直接实现类?
最佳答案
我很高兴看到有人质疑这种做法。
Spring 框架很久以前引入了为其托管服务/DAO bean 定义接口(interface)的模式。我认为这种做法的引入是由于他们用于创建动态代理的技术的限制。
定义 Spring 管理的 bean 时,框架会创建底层实例的代理,目的是使用 AOP 技术用横切功能来装饰它。显然,他们在 Spring Famework 的早期版本中用于实现这些代理的工具需要一个接口(interface)来从中创建代理。
最新版本的 Spring Framework 中不再满足此要求,您可以安全地处理这些无用的接口(interface)。
如今,易于测试的原因也不再成立,因为像 Mockito 这样的模拟框架也能够模拟具体类。 此外,您可以使用 @Primary 注释在测试上下文中将实际实现替换为自定义模拟。
出于这些原因,我会废弃内部服务和 DAO 类的接口(interface),因为它们永远不会有多个共存的有效实现。
保留真正需要的设计模式的接口(interface)。
关于java - Dao 和服务接口(interface)的需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38618995/