2012-01-17 46 views
2

大多数(弹簧和JPA)类都是用接口设计的。 除继承任何技术原因是否存在?像dynaimc代理或AOP,我需要这个使用接口的原因有哪些(Java EE或Spring和JPA)

public interface UserDAO { 
    void delete(); 
    void update(); 
    void save(); 
    List<User> get(); 
} 

public class UserDAOImpl implements UserDAO { 
    public void delete(){} 
    public void update(){} 
    public void save(){} 
    public List<User> get(){} 
} 
+0

的[弹簧和接口(http://stackoverflow.com/questions/256255/spring-and-interfaces) – tolitius 2012-01-17 22:29:43

回答

20

主要有3个原因,IMO:

第一个原因:proxie秒。

如果你问Spring的UserDAO类型的bean,它实际上会返回一个代理封装实际的UserDAOImpl实例。这使得它可以划分事务,验证安全授权,记录访问,计算统计数据等。可以在没有接口的情况下完成,但是需要字节码操作。

第二个原因:可测性。

在对使用UserDAO的业务服务进行单元测试时,通常需要注入一个模拟的UserDAO实现。再次,当UserDAO是一个接口时,这样做更容易。这可能与一个具体的类,但它并不总是,并且它更容易与一个接口

第三个原因:解耦。

通过使用接口,您可以在其中为客户定义DAO的实际合同。当然,在具体实施中它需要一个setDataSource()方法,但客户不关心这一点。他们所需要的只是DAO提供的一组数据访问方法。通过分离接口和具体实现,可以确保客户端不依赖DAO的实现细节。

+0

谢谢。第一个原因+1(可能没有接口,但需要字节码操作) – Arun 2012-01-17 13:28:19

+1

你是指所有三个权利+1?编码到接口时,单元测试更容易。 – 2012-01-17 13:40:36

+0

当然是全部 – Arun 2012-01-17 13:48:40

6
  1. 接口,一个是合同,因为我看到他们更多的技术细节。例如,一组软件工程师(Implementation classes)可能与公司(Interface)有特定的合同。根据项目需要,公司可能会不定期地在工程师之间进行切换。由于他们属于同一合同并遵循相同的规则,因此每次项目需要变更时,切换都比从外部引入资源(编写新课程)更容易。你只需要改变配置来切换实现类。

  2. 接口是干净的,并且是对类实现的规则的单点访问。

链接

  1. spring and interfaces
  2. What does it mean to "program to an interface"?
  3. http://www.artima.com/lejava/articles/designprinciples.html
+1

引用现有问题瓦特可能重复/ o进一步的讨论应该几乎总是要么是密切/重复的投票,要么是IMO的评论。 – 2012-01-17 13:01:43

+0

@Dave牛顿 - 让人们指向正确的方向有时候会消耗一些时间,我觉得应该是“获奖”。 upvote说'这个答案很有用',并被那些认为有用的国际海事组织选择是可以接受的。 – 2012-01-17 13:42:26

+0

我很好,你相信任何你想要的;我们不建议按照[这里](http://meta.stackexchange.com/questions/118582/what-is-an-acceptable-answer)和[here](http:// meta。 stackexchange.com/questions/118926/right-way-to-answer-a-question-with-just-a-link)。 – 2012-01-17 14:05:01