在我见过的所有 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/