需要单独的接口和DAI的impl

时间:2012-07-04 05:58:27

标签: java spring mocking dao

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

  1. 如果您对同一个接口有多个实现,那么抽象是有帮助的。但鉴于我们已经选择了用于DAOImpl的框架(比如说iBATIS),它真的需要吗?
  2. 通过Spring帮助代理。从我收集的内容来看,具有接口的类可以很容易地代理(进入JdkProxy路由)而不是没有接口的类(选择cglib路由的地方),并且一个类具有要代理的类的子类。子类化的问题在于代理类是final或者没有默认构造函数 - 这两者在数据访问层都不太可能。性能曾经是一个因素,但从我听到的情况来看,它不再是一个令人担忧的原因。
  3. 帮助嘲笑。具有接口的类更适合由模拟框架模拟。我只听说过这个,但实际上没有看到它 - 所以不能指望它,但也许是因为与上面#2中提到的相同的因素。
  4. 有了这些观点,我觉得真正需要一个单独的FooDAO和FooDAOImpl,其中一个简单的FooDAO就足够了。请随意更正我提到的任何要点。

    提前致谢!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我看到第四个原因:

  • 隐藏实施细节

根据团队的情况,软件的预期寿命或未来预期的变化量,即使只有一个实现,也要尽可能地隐藏。

答案 2 :(得分:0)

我会说具有FooDAO接口和单个实现FooDAOImpl通常是一种反模式。更简单的解决方案(没有DAO的单独接口)是更可取的,除非你有其他坚实的理由 - 这似乎不是这里的情况。

就个人而言,我会更进一步说,拥有DAO并不是最好的选择。我更喜欢在ORM API(如Hibernate或JPA)之上实现单个持久性Facade类。不过,也许iBATIS的水平太低了。