java - 将 DAO 类与应用程序实际实例化的 DAO 类分开的目的是什么

标签 java spring design-patterns dao factory-pattern

将 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/

相关文章:

java - Spring WebMVC 5 - 基于注释的拦截器

c# - 使用设计模式 C# 优雅地解决问题

java - 我有一个字符串变量和另一个分配给同一个变量的字符串。那么如何获取旧字符串呢?

Java - 能够交错来自多个 Reader 的行的 Reader 类

java - 如何在java配置中获取外部定义的bean

c++ - 从基类指针访问派生类成员的设计替代方案

design-patterns - 设计模式 - 构建器和抽象工厂之间的选择

java - 地理服务器管理器,添加一个新层

java - 类型不兼容的问题

java - 是否有 JSON_CONTAINS 谓词的 QueryDSL 表示?