将 DAO 类与应用程序代码中实际实例化的 DAO 类分开有什么好处,即为什么不在这样的场景中直接实例化 DAO 类:
Class CreateIocContainer{
p s v main(String[] args){
new IocContainer("springMetadataFile.xml");
}
}
Class ClassThatInstantiatesServicesViaSpringBean{
Services services;
// bean setter for services class
setServices(Services services){
this.services = services
}
}
Class ServicesImpl implements Services
ServicesDao servicesDao;
String getSomethingFromDB(String argumentForQuery){
return servicesDao.getSomethingFromDB(argumentForQuery);
}
}
Class ServicesDaoImpl implements ServicesDao{
String getSomethingFromDb(String argumentForQuery){
//code to return something from db
return queryResultString;
}
}
另外,我称为 Class ClassThatInstantiatesServicesViaSpringBean 的类是否是一个工厂类,并且通常命名为 Class XFactory ?
最佳答案
您的 DAO 始终是接口(interface),而不是类。这个 DAO 基本上是一种设计模式。 DAO 及其实现的这种分离为分离对象持久机制和数据访问逻辑提供了一种很好的技术。
今天在您提到的 bean xml 文件中,
<bean name="ServiveDao" class="com.example.ServiceImplHibnernate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
但是明天您可能希望您的应用程序使用您完成的不同实现而不更改客户端代码。例如,您使用 ibatis 重写了实现,并添加了附加功能来满足您的需求。所以你写一个类
class ServiceImplIBAtis implements ServiceDao {..}
并更改 xml 文件以加载您的实现
<bean name="ServiveDao" class="com.mycompany.ServiceImplIBAtis">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
无论何时引用 bean ServiceDao,spring 都会注入(inject) ServiceImplIBAtis 实例而不是 ServiceImplHibnernate。现在您的应用程序不需要知道后台发生了什么变化。它只需要知道有一个名为 Service 的 dao,并且有一些可用于数据访问的方法。
关于java - 将 DAO 类与应用程序实际实例化的 DAO 类分开的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5675350/