spring - 有什么理由使用接口(interface)(Java EE 或 Spring 和 JPA)

标签 spring design-patterns jakarta-ee

大多数 J2EE(Spring 和 JPA)类都是用接口(interface)设计的。 继承除外 ,这有什么技术原因吗?像动态代理或 AOP,我需要更多关于此的技术细节

前任

public interface UserDAO {
   void delete();
   void update();
   void save();
   List<User> get();
}

public class UserDAOImpl implements UserDAO {
   public void delete(){}
   public void update(){}
   public void save(){}
   public List<User> get(){}
}

最佳答案

有3个主要原因,IMO:

第一个原因:代理。

如果您向 Spring 询问 UserDAO 类型的 bean,它实际上会返回一个封装实际 UserDAOImpl 实例的代理。这允许它划分事务、验证安全授权、日志访问、计算统计等。可以在没有接口(interface)的情况下完成,但是需要字节码操作。

第二个原因:可测试性。

在对使用 UserDAO 的业务服务进行单元测试时,您通常会注入(inject)一个模拟 UserDAO 实现。再一次,当 UserDAO 是一个接口(interface)时,这更容易做到。使用具体类是可能的,但并非总是如此,而且使用接口(interface)仍然更容易

第三个原因:脱钩。

通过使用接口(interface),您可以为客户定义 DAO 的真实合约。当然,它需要一个 setDataSource()具体实现中的方法,但客户并不关心这一点。他们所需要的只是 DAO 提供的一组数据访问方法。通过分离接口(interface)和具体实现,您可以确保客户端不依赖 DAO 的实现细节。

关于spring - 有什么理由使用接口(interface)(Java EE 或 Spring 和 JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8894883/

相关文章:

spring - 将服务类标记为事务性时 DAO 中出现 "No Session found for current thread"错误

spring - 从 JUnit 测试访问 spring 上下文

java - Hibernate Envers 不使用 SpringMVC 配置在审计表中写入任何内容

Java 通用接口(interface)返回类型

c++ - 哪种类型的继承更可取?

Haskell - 由于我不明白的原因,非穷举模式

java - 单点登录成功登录后重定向到不同的 URL

spring - 在服务中使用多个服务或多个存储库?

java - jconsole 可以与 Java EE 一起使用吗?

java - 取消部署 Java EE 应用程序时如何停止线程?