java - 服务和 DAO 总是实现接口(interface)

标签 java spring spring-mvc

在我见过的所有 MVC 项目中,“服务”和“DAO”类总是实现它们自己的接口(interface)。但几乎所有时候,我都没有看到使用此接口(interface)有用的情况。

在这些情况下是否有任何理由使用接口(interface)?在“服务”和“DAO”类中不使用接口(interface)可能会产生什么后果?我无法想象任何后果。

最佳答案

Spring 是一个控制反转容器。从某种意义上说,这意味着您使用的类的实现不落在应用程序上,而是落在其配置上。如果你有一个需要 UserRepository 来存储 User 实例的类,它会是这样的

class UserService {
    @Autowired
    private UserRepository userRepository;
}

interface UserRepository {
    List<User> getUsers();
    User findUserBySIN(String SIN);
    List<User> getUsersInCountry(Long couyntryId);
}

你会为它声明一个 bean

<bean class="com.myapp.UserRepositoryHibernateImpl">
   ...
</bean>

注意这个 bean 是 UserRepositoryHibernateImpl,它将实现 UserRepository

在世界 future 的某个时刻,Hibernate 项目不再受支持,您确实需要一个仅在 Mybatis 上可用的功能,因此您需要更改实现。因为您的 UserService 类正在使用用接口(interface)类型声明的 UserRepository,所以只有接口(interface)上可见的方法对类是可见的。因此,更改 userRepository 的实际多态类型不会影响客户端代码的其余部分。您需要更改的所有内容(不包括创建新类)是

<bean class="com.myapp.future.UserRepositoryMyBatisImpl">
   ...
</bean>

并且您的应用程序仍然有效。

关于java - 服务和 DAO 总是实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18477119/

相关文章:

java - 为 JMS 队列创建 JBoss 连接池

java - Hibernate:映射来自另一个表列的值

java - net::ERR_CONTENT_LENGTH_MISMATCH - 加载 javascript 失败

java - 以编程方式访问 portlet 特定上下文中的 Bean

java - Spring MVC : correct exception handling

java - 在 spring-boot 中将 hashmap 转换为 json 字符串

java - 如何为 Ant 任务创建嵌套元素?

java - 声明静态 ApplicationContext 会导致内存泄漏吗? ( Spring 3)

java - 有没有办法缓存 Spring <mvc :resources> files in memory?

Spring MVC “redirect:/” 前缀重定向,包括端口号