java - Dao 和服务接口(interface)的需求

标签 java spring spring-mvc interface

我是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/

相关文章:

java - Spring Data JDBC - 一对多 - Kotlin

java - 出现错误 404 源服务器未找到目标资源的当前表示或不愿意透露该表示存在

java - 在 Spring MVC 中处理更新表单

java - Java Spring 3.0 MVC 是否像 Asp.net MVC 2.0 一样支持基于注释/属性的客户端验证?

spring - 使用 tukey,当特定参数存在时从 url 中删除所有查询字符串参数

java - java的内部类会带来安全风险吗?

java - 如何将 jaxb 打印到 java 对象到记录器中

java - 使用 MultipartFile 作为可选字段的多部分请求 - Spring MVC

java - 比较两个对象的相等性有哪些替代方法?

java - Java-线程和静态变量