在实际应用中,我采用的是ss2h框架开发。由于思维定势,每个dao的实现都必须实现接口。但是我不知道这样做有什么必要。我觉得每个dao先定义一个接口然后再实现并没有太大的意义。能不能详细的和我解释一下接口在此框架中是怎么起到解耦作用的。

解决方案 »

  1.   

    写接口的是因为spring的原因,只有接口可以被注入,具体怎么实现方法,spring是不管的
      

  2.   

    就单单只是因为spring需要依靠接口注入啊
      

  3.   

    大哥你如果是简单的玩和做一个DEMO而已的话,肯定不要这么麻烦来实现啊,SSH框架的目的本质就是为了实现解耦合,灵活性,便于维护和后期修改的。所以定义接口就是为了不同实现阿,工作中特别是大型项目就是为了后期的容易,并不是简单的现在的麻烦
      

  4.   

    这个正解,我补充一句,其实在集成中实际上是可以跳过接口这一层直接注入类的,不过这要引入另外的JAR包,叫什么我忘了,在spring的标准jar中有,但是这不符合国际惯例,哈哈,也不是个好习惯,建议LZ还是按照标准的流程来
      

  5.   

    晕倒,跟spring有什么关系,接口的作用就是用来解耦合的,就是让调用者不去关心具体实现,只负责调用接口方法就OK了,具体实现变了也不需要到处改调用的代码。
      

  6.   

    好了,你这样一问,java的最大好处,面向接口编程被你否定了。。
      

  7.   

    使用,spring框架,是为什么 了日后更好的维护。同时,也减少了,程序员对底层代码的编写。能理解,这些,就差不多了。
      

  8.   

    谁说spring只能注入接口
    也把spring说得太烂了点吧
    接口的目的在意多元多样化
    实现修改的便捷,而不是为了注入
    简单的说注入就是一部装配机器
    你给他什么他帮你装配什么
      

  9.   

    我总结下:第一,使用接口是从架构方面考虑,面向接口编程这是我们提倡的。第二,楼上有人说只能注入接口这点事在我们使用AOP时要考虑的,比方说你的dao上加@transaction后。
      

  10.   

    interface是 依赖注入的3种方法之一
      

  11.   

    SPring通过它自身的IoC的机制使类的创建不再直接依赖于new来创建,而所有的类都交由Spring管理,而我们只需要使用spring的类实例即bean就行,不需关心它的创建和回收,大大降低类之间的直接依赖关系,这就是所谓解耦合。
      

  12.   

    1.这是面向接口编程的方式。你需要好好看看 面向接口编程的优势!
    2.在spring注入的时候 一般注入的都是接口。
      

  13.   

    10楼++
    接口就是为了解耦今后的扩展与维护与spring没有必然联系
    至于spring 里面的配置,注入未必要接口,只要这个bean存在就行了。
    但这样,spring效果就大在降低了
    另外接口并非只是在spring框架中才有解耦作用
    详细的,网上查一下接口编程之类的信息
    个人见解
      

  14.   

    谁告诉只能是接口才能注入啊  都是扯.DAO要不要实现接口,跟你设计有关系不要啥东西一来,就是贫血的entity,然后DAO接口  DAO实现,Service接口,Service中注入DAO开发又不是教条,但很多人却奉为圣经。
      

  15.   


    public class NormalClass {
    private String name;
    private int age;
    private long year; @ConstructorProperties({ "name", "age" })
    public NormalClass(String name, int age) {
    this.name = name;
    this.age = age;
    } @ConstructorProperties({ "year" })
    public NormalClass(long year) {
    this.year = year;
    } private List<String> lists; public List<String> getLists() {
    return lists;
    } public void setLists(List<String> lists) {
    this.lists = lists;
    } public String getName() {
    return name;
    } public int getAge() {
    return this.age;
    } public long getYear() {
    return year;
    } public void setYear(long year) {
    this.year = year;
    }}
    <bean id='configTest' name="configTest3,configTest2" class="study.spring.beans.NormalClass"
    p:year='2011'>
    <constructor-arg name="name" value="normalstring" />
    <constructor-arg index="1" value="38" />
    <property name="lists">
    <list>
    <value>abc</value>
    <value>efg</value>
    </list>
    </property>
    </bean>
    这个要这么解释!这个难道不算是注入么!!
      

  16.   

    写接口的是因为spring的原因,只有接口可以被注入
    这句话有点
      

  17.   

    写接口和spring是没有任何关系的 做一个真实的项目你不可能不写接口的  一个项目要能解耦要以后维护要扩展的  你不能每次维护 扩展多去修改里面的代码吧 那你这个项目也只能就此瘫痪了 (因为你是和spring整合了  就把所有的东西交个spring去管理  这叫控制反转(IOC)   )
      

  18.   

    看了楼主的回答 完全费掉了。。接口是一种规范为什么要这么写呢因为多人合作的规范。。当你定义好了接口后 至于dao怎么实现 就是每个人的事情了,接口是多人合作的规范!!!
    当你项目一旦使用框架时,避免不了 多人合作的。
      

  19.   

    举几个例子接口好处的例子,
    (1)两个人开发两个模块,一个是完成对数据库的基本操作,一个是在调用前一个人的操作实现业务,第二个人只需要提供给前一个人一个接口,具体的前一个人实现就好了,两个人互相不用管对方的代码。
    (2)如果本来这个项目用的是Oracle,现在要用sql server,只需要重写一个符合接口的实现类就可以,主程序不用动
      

  20.   

    IOC有两种实现方式,正常我们常用的都是通过SET方法来依赖注入,要spring的配置文件里配置,还有一个方式用得不是很好,通过构造方法来依赖注入。
      

  21.   

    这家伙其实想知道接口的好处..
    搞个通俗点的例子
    public interface ITest{
       // 得到一个儿子
      public Son getSun();
    }public class implements ITest{
      public Son getSun(){
       // 这里随便你搞啊,你可以找个小姐生儿子,也能找个妇女生儿子.想怎么都行,最终返回一个儿子就好了
      return //搞出的儿子
    }
    }
    接口就是一个契约,约定好规则或者结果,至于你怎么搞,随便你.
    就像上面生儿子的接口一样,只要一个儿子就好了,至于你怎么生,那就是你的事了.
    加入哪天找不到你了,他找别人生也很简单..实现的方法改改就OK了.
      

  22.   

    主要是因为lz还就没体会到接口的好处,java这么受大众的欢迎,接口的设计是功不可没的
      

  23.   

    当项目中用到AOP时,才必须定义成接口,而DAO层中的逻辑一般都包含事务控制,所以项目刚开始时候才会在Dao层和service层,service和Action层之间都定义接口,因为这样的话才能够对service层进行事务控制的时候不用更改已经实现的代码(当然用spring的      CGLIB也是可以的,但是这种方法是spring不推荐的),如果你要对Dao层进行事务控制的话,用spring的话最好是每层之间都依赖于接口而不是具体实现类
    Spring中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的, spring在这段时间内通过拦截器,加载事务切片。原理就是这样
    动态代理的一个重要特征是,它是针对接口的,所以我们的dao要通过动态代理来让spring接管事务,就必须在dao前面抽象出一个接口,当然如果没有这样的接口,那么spring会使用CGLIB来解决问题,但这不是spring推荐的方式,所以不做讨论.大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择, 因而这是和非侵入性的轻量级容器的观念是一致的。
    我也有楼主这样的困惑,看了楼上各位的解答以及我自己在网上看的东西,总结出了上面的内容,希望能对你有所启发.
      

  24.   

    MARking 35楼的解释碉堡了!
      

  25.   


    使用java的动态代理,java.lang.reflect.Proxy类创建代理。要求目标对象必须要实现接口(只有这样才能创建代理),推荐动态代理,加载速度快。
    配置代理时要配置接口
    <property name="proxyInterfaces">  配置接口
                <list>
                   <value>com......dao</value>
                </list>
            </property>
      

  26.   

    Hibernate和Spring负责管理的职责不一样。Hibernate是管理工程的数据库连接,而Spring是管理类的组织结构的。