我们有一个典型的n层Java应用程序,我注意到我们的数据访问层具有类型为FooDAO和FooDAOImpl的DAO。我试图证明两者的必要性,这是我的分析。

  • 如果同一接口有多个实现,则抽象很有用。但是,既然我们已经选择了要用于DAOImpl的框架(例如iBATIS),真的需要吗?
  • 帮助通过Spring进行代理。据我所知,具有接口的类可以很容易地被代理(通过JdkProxy路由),而不是没有接口的类(在其中选择了cglib路由),并且具有要被代理的类的子类。子类化存在以下问题:要代理的类是最终类,或者没有默认构造函数-两者在数据访问层上都不太可能出现。性能曾经是一个因素,但是据我所知,它不再是引起关注的原因。
  • 帮助进行模拟。具有接口的类更适合被模拟框架模拟。我只听到过此消息,但在实践中却没有看到它-因此无法真正依靠它,但这可能是由于与上述#2中提到的因素相同。

  • 基于以上几点,我并不真正需要单独的FooDAO和FooDAOImpl来满足需要,而简单的FooDAO就足够了。随时纠正我提到的任何要点。

    提前致谢!

    最佳答案

    我在Mockito上尝试了#3,它能够在没有接口的情况下模拟POJO。有了针对#1和#2提到的论点,我倾向于暂时不使用单独的DAO和DAOImpl。随时添加其他比较点。

    08-06 10:36