hibernate和spring集成一起时,为什么每个dao都需要先写一个接口,然后再对接口实现呢?

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

45 个解决方案

#1


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

#2


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

#3


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

#4


引用 1 楼 chris_zcl 的回复:
写接口的是因为spring的原因,只有接口可以被注入,具体怎么实现方法,spring是不管的

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

#5


好吧!

#6


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

#7


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

#8


引用 7 楼 crlystaldong 的回复:
好了,你这样一问,java的最大好处,面向接口编程被你否定了。。。。。

举个列子说明一下

#9


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

#10


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

#11


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

#12


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

#13


面向接口编程降低耦合度。。。

#14


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

#15


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

#16


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

#17


解耦~~~~~~~

#18


楼主看来只是在玩玩具 并没有接触过真正的大型项目

#19


谁告诉只能是接口才能注入啊  都是扯.

DAO要不要实现接口,跟你设计有关系

不要啥东西一来,就是贫血的entity,然后DAO接口  DAO实现,Service接口,Service中注入DAO

开发又不是教条,但很多人却奉为圣经。

#20


引用 1 楼 chris_zcl 的回复:
写接口的是因为spring的原因,只有接口可以被注入,具体怎么实现方法,spring是不管的


???!!!

#21


引用 20 楼 oxcow 的回复:
引用 1 楼 chris_zcl 的回复:

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


???!!!


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>

这个要这么解释!

这个难道不算是注入么!!

#22


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

#23


学习了,才出江湖

#24


不是吧,所有类都可以注入。我想这应该是接口注入了是为了让所有实现类都可以注入,
引用 1 楼 chris_zcl 的回复:
写接口的是因为spring的原因,只有接口可以被注入,具体怎么实现方法,spring是不管的

#25


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

#26


引用 18 楼 ylovep 的回复:
楼主看来只是在玩玩具 并没有接触过真正的大型项目

没有接手过很大的项目,目前在做云计算中心。我们单位一个人负责一个项目

#27


为了心情不好了可以换

#28


看了楼主的回答 完全费掉了。。。。。

接口是一种规范。。。为什么要这么写呢

因为多人合作的规范。。

当你定义好了接口后 至于dao怎么实现 就是每个人的事情了,接口是多人合作的规范!!!


当你项目一旦使用框架时,避免不了 多人合作的。

#29


所以你们单独做小项目时 没感觉 其实也不需要!!!

但当大项目的时候 

多个模块一并开发时 一定是先定义接口规范。。。切记!!!

#30


不写接口,项目怎么分层

#31


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

#32


如果,整个项目的所有内容都是自己负责,包括以后的扩展维护,那我感觉怎么写都无所谓了。自己感觉怎么方便怎么来呗

#33


深刻理解一下 依赖注入 吧!

#34


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

#35


这家伙其实想知道接口的好处..
搞个通俗点的例子


public interface ITest{
   // 得到一个儿子
  public Son getSun();
}

public class implements ITest{
  public Son getSun(){
   // 这里随便你搞啊,你可以找个小姐生儿子,也能找个妇女生儿子.想怎么都行,最终返回一个儿子就好了
  return //搞出的儿子
}
}


接口就是一个契约,约定好规则或者结果,至于你怎么搞,随便你.
就像上面生儿子的接口一样,只要一个儿子就好了,至于你怎么生,那就是你的事了.
加入哪天找不到你了,他找别人生也很简单..实现的方法改改就OK了.

#36


引用 35 楼 unique_wu 的回复:
这家伙其实想知道接口的好处..
搞个通俗点的例子

Java code

public interface ITest{
   // 得到一个儿子
  public Son getSun();
}

public class implements ITest{
  public Son getSun(){
   // 这里随便你搞啊,你可以找个小姐生儿子,也能找个妇女生儿子.想怎么都行,……

。。。。。。

#37


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

#38


当项目中用到AOP时,才必须定义成接口,而DAO层中的逻辑一般都包含事务控制,所以项目刚开始时候才会在Dao层和service层,service和Action层之间都定义接口,因为这样的话才能够对service层进行事务控制的时候不用更改已经实现的代码(当然用spring的      CGLIB也是可以的,但是这种方法是spring不推荐的),如果你要对Dao层进行事务控制的话,用spring的话最好是每层之间都依赖于接口而不是具体实现类


Spring中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的, spring在这段时间内通过拦截器,加载事务切片。原理就是这样
动态代理的一个重要特征是,它是针对接口的,所以我们的dao要通过动态代理来让spring接管事务,就必须在dao前面抽象出一个接口,当然如果没有这样的接口,那么spring会使用CGLIB来解决问题,但这不是spring推荐的方式,所以不做讨论.

大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择, 因而这是和非侵入性的轻量级容器的观念是一致的。


我也有楼主这样的困惑,看了楼上各位的解答以及我自己在网上看的东西,总结出了上面的内容,希望能对你有所启发.

#39


混个脸熟

#40


引用 35 楼 unique_wu 的回复:
这家伙其实想知道接口的好处..
搞个通俗点的例子


Java code

public interface ITest{
   // 得到一个儿子
  public Son getSun();
}

public class implements ITest{
  public Son getSun(){
   // 这里随便你搞啊,你可以找个小姐生儿子,也能找个妇女生……


哥们真NB

面向接口的编程是为了降低耦合,更加易于维护方便!如果是大型项目的话,你很快即能感受到面向接口的好处!

#41


MARking 35楼的解释碉堡了!

#42


其实没必要这么麻烦,我就是跳过接口,直接注入类的。

#43


确实也是可以
但是提供接口的话你可以用不同方法来实现这个接口

#44


引用 38 楼 ldhscxl 的回复:
当项目中用到AOP时,才必须定义成接口,而DAO层中的逻辑一般都包含事务控制,所以项目刚开始时候才会在Dao层和service层,service和Action层之间都定义接口,因为这样的话才能够对service层进行事务控制的时候不用更改已经实现的代码(当然用spring的      CGLIB也是可以的,但是这种方法是spring不推荐的),如果你要对Dao层进行事务控制的话,用spring的话最好是每层之间都依赖于接口而不是具体实现类


Spring中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的, spring在这段时间内通过拦截器,加载事务切片。原理就是这样
动态代理的一个重要特征是,它是针对接口的,所以我们的dao要通过动态代理来让spring接管事务,就必须在dao前面抽象出一个接口,当然如果没有这样的接口,那么spring会使用CGLIB来解决问题,但这不是spring推荐的方式,所以不做讨论.

大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择, 因而这是和非侵入性的轻量级容器的观念是一致的。


我也有楼主这样的困惑,看了楼上各位的解答以及我自己在网上看的东西,总结出了上面的内容,希望能对你有所启发.


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

#45


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

#1


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

#2


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

#3


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

#4


引用 1 楼 chris_zcl 的回复:
写接口的是因为spring的原因,只有接口可以被注入,具体怎么实现方法,spring是不管的

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

#5


好吧!

#6


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

#7


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

#8


引用 7 楼 crlystaldong 的回复:
好了,你这样一问,java的最大好处,面向接口编程被你否定了。。。。。

举个列子说明一下

#9


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

#10


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

#11


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

#12


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

#13


面向接口编程降低耦合度。。。

#14


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

#15


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

#16


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

#17


解耦~~~~~~~

#18


楼主看来只是在玩玩具 并没有接触过真正的大型项目

#19


谁告诉只能是接口才能注入啊  都是扯.

DAO要不要实现接口,跟你设计有关系

不要啥东西一来,就是贫血的entity,然后DAO接口  DAO实现,Service接口,Service中注入DAO

开发又不是教条,但很多人却奉为圣经。

#20


引用 1 楼 chris_zcl 的回复:
写接口的是因为spring的原因,只有接口可以被注入,具体怎么实现方法,spring是不管的


???!!!

#21


引用 20 楼 oxcow 的回复:
引用 1 楼 chris_zcl 的回复:

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


???!!!


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>

这个要这么解释!

这个难道不算是注入么!!

#22


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

#23


学习了,才出江湖

#24


不是吧,所有类都可以注入。我想这应该是接口注入了是为了让所有实现类都可以注入,
引用 1 楼 chris_zcl 的回复:
写接口的是因为spring的原因,只有接口可以被注入,具体怎么实现方法,spring是不管的

#25


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

#26


引用 18 楼 ylovep 的回复:
楼主看来只是在玩玩具 并没有接触过真正的大型项目

没有接手过很大的项目,目前在做云计算中心。我们单位一个人负责一个项目

#27


为了心情不好了可以换

#28


看了楼主的回答 完全费掉了。。。。。

接口是一种规范。。。为什么要这么写呢

因为多人合作的规范。。

当你定义好了接口后 至于dao怎么实现 就是每个人的事情了,接口是多人合作的规范!!!


当你项目一旦使用框架时,避免不了 多人合作的。

#29


所以你们单独做小项目时 没感觉 其实也不需要!!!

但当大项目的时候 

多个模块一并开发时 一定是先定义接口规范。。。切记!!!

#30


不写接口,项目怎么分层

#31


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

#32


如果,整个项目的所有内容都是自己负责,包括以后的扩展维护,那我感觉怎么写都无所谓了。自己感觉怎么方便怎么来呗

#33


深刻理解一下 依赖注入 吧!

#34


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

#35


这家伙其实想知道接口的好处..
搞个通俗点的例子


public interface ITest{
   // 得到一个儿子
  public Son getSun();
}

public class implements ITest{
  public Son getSun(){
   // 这里随便你搞啊,你可以找个小姐生儿子,也能找个妇女生儿子.想怎么都行,最终返回一个儿子就好了
  return //搞出的儿子
}
}


接口就是一个契约,约定好规则或者结果,至于你怎么搞,随便你.
就像上面生儿子的接口一样,只要一个儿子就好了,至于你怎么生,那就是你的事了.
加入哪天找不到你了,他找别人生也很简单..实现的方法改改就OK了.

#36


引用 35 楼 unique_wu 的回复:
这家伙其实想知道接口的好处..
搞个通俗点的例子

Java code

public interface ITest{
   // 得到一个儿子
  public Son getSun();
}

public class implements ITest{
  public Son getSun(){
   // 这里随便你搞啊,你可以找个小姐生儿子,也能找个妇女生儿子.想怎么都行,……

。。。。。。

#37


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

#38


当项目中用到AOP时,才必须定义成接口,而DAO层中的逻辑一般都包含事务控制,所以项目刚开始时候才会在Dao层和service层,service和Action层之间都定义接口,因为这样的话才能够对service层进行事务控制的时候不用更改已经实现的代码(当然用spring的      CGLIB也是可以的,但是这种方法是spring不推荐的),如果你要对Dao层进行事务控制的话,用spring的话最好是每层之间都依赖于接口而不是具体实现类


Spring中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的, spring在这段时间内通过拦截器,加载事务切片。原理就是这样
动态代理的一个重要特征是,它是针对接口的,所以我们的dao要通过动态代理来让spring接管事务,就必须在dao前面抽象出一个接口,当然如果没有这样的接口,那么spring会使用CGLIB来解决问题,但这不是spring推荐的方式,所以不做讨论.

大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择, 因而这是和非侵入性的轻量级容器的观念是一致的。


我也有楼主这样的困惑,看了楼上各位的解答以及我自己在网上看的东西,总结出了上面的内容,希望能对你有所启发.

#39


混个脸熟

#40


引用 35 楼 unique_wu 的回复:
这家伙其实想知道接口的好处..
搞个通俗点的例子


Java code

public interface ITest{
   // 得到一个儿子
  public Son getSun();
}

public class implements ITest{
  public Son getSun(){
   // 这里随便你搞啊,你可以找个小姐生儿子,也能找个妇女生……


哥们真NB

面向接口的编程是为了降低耦合,更加易于维护方便!如果是大型项目的话,你很快即能感受到面向接口的好处!

#41


MARking 35楼的解释碉堡了!

#42


其实没必要这么麻烦,我就是跳过接口,直接注入类的。

#43


确实也是可以
但是提供接口的话你可以用不同方法来实现这个接口

#44


引用 38 楼 ldhscxl 的回复:
当项目中用到AOP时,才必须定义成接口,而DAO层中的逻辑一般都包含事务控制,所以项目刚开始时候才会在Dao层和service层,service和Action层之间都定义接口,因为这样的话才能够对service层进行事务控制的时候不用更改已经实现的代码(当然用spring的      CGLIB也是可以的,但是这种方法是spring不推荐的),如果你要对Dao层进行事务控制的话,用spring的话最好是每层之间都依赖于接口而不是具体实现类


Spring中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的, spring在这段时间内通过拦截器,加载事务切片。原理就是这样
动态代理的一个重要特征是,它是针对接口的,所以我们的dao要通过动态代理来让spring接管事务,就必须在dao前面抽象出一个接口,当然如果没有这样的接口,那么spring会使用CGLIB来解决问题,但这不是spring推荐的方式,所以不做讨论.

大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择, 因而这是和非侵入性的轻量级容器的观念是一致的。


我也有楼主这样的困惑,看了楼上各位的解答以及我自己在网上看的东西,总结出了上面的内容,希望能对你有所启发.


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

#45


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