Java 在dao中集成hibernate和spring,而不依赖spring

Java 在dao中集成hibernate和spring,而不依赖spring,java,spring,hibernate,Java,Spring,Hibernate,当我们将hibernate与spring集成时,我们通常实现@Repository spring annotation使用的基于注释的方法。我了解到这样做的目的是为了消除dao中的spring依赖,因为hibernate3支持上下文会话来管理会话 @Repository public class HibernateSpitterDao implements SpitterDao{ privateSessionFactorysessionFactory; @Autowired public H

当我们将hibernate与spring集成时,我们通常实现@Repository spring annotation使用的基于注释的方法。我了解到这样做的目的是为了消除dao中的spring依赖,因为hibernate3支持上下文会话来管理会话

@Repository
public class HibernateSpitterDao implements SpitterDao{

privateSessionFactorysessionFactory;

@Autowired
public HibernateSpitterDao(SessionFactory sessionFactory){
  this.sessionFactory=sessionFactory;
}

private SessioncurrentSession(){
  return sessionFactory.getCurrentSession();
}
...
}
例如,如果我们不使用基于注释的方法,我们的dao将直接依赖于特定于spring的类,比如需要扩展HibernateDaoSupport

但即使有注释,道仍然依赖于春天,知道吗?因为@Repository是spring注释。我们不能完全独立于spring知道吗?它更像是依赖于spring注释,而不是依赖于spring类,是吗


我只是在想,好吧,过一会儿我们需要把弹簧换成别的东西。在这种情况下,如果我们的DAO对spring没有依赖性,我们根本不需要接触DAO。

要实现完全解耦,您必须远离注释,正如您已经发现的那样。或者,您必须使用基于SpringXML的配置,或者创建一个类,即基于java的配置来构建bean工厂


我只想谈谈你的想法。花时间在一个完全去耦合的解决方案上,也许将来某个时候我们会想切换,这听起来对我来说是浪费了很多时间。您是否有任何理由怀疑或假设这样的转换将在可预见的未来完成,或者永远不会完成?你的脱钩是有代价的,这是清楚的。与易于查看的注释不同,您必须维护XML文件和/或配置类,这两种文件和/或配置类往往会变得非常复杂,过一段时间后很难进行查看。

要实现完全解耦,您必须远离注释,正如您已经发现的那样。或者,您必须使用基于SpringXML的配置,或者创建一个类,即基于java的配置来构建bean工厂


我只想谈谈你的想法。花时间在一个完全去耦合的解决方案上,也许将来某个时候我们会想切换,这听起来对我来说是浪费了很多时间。您是否有任何理由怀疑或假设这样的转换将在可预见的未来完成,或者永远不会完成?你的脱钩是有代价的,这是清楚的。您将不得不维护XML文件和/或配置类,而不是易于查看的注释,这两个文件和/或配置类往往会变得非常复杂,过一段时间后很难进行概述。

我想说,您提供的示例并不严格依赖于Spring。您使用的唯一Spring组件是@Repository注释,它1充当@component,让您对类进行组件扫描,2使您的类符合数据访问转换的条件

这根本不是将您的实现与Spring耦合。相反,您使用的是Hibernate的会话工厂,并且与之耦合。您的实现与Hibernate结合在一起是可以的

事实上,这就是定义接口并对其进行不同实现的全部目的。在本例中,您有一个SpitterDAO接口和一个HibernateSpitterDAO实现。如果将来决定使用iBatis或Spring的HibernateTemplate或JDBCTemplate,则可以编写不同的实现

春天在大部分时间里都试图避开你。它主要用作管理依赖项注入的容器,实际上只是协调代码如何粘合在一起。我认为,当您有实现ApplicationSessionAware和BeanPostProcessor之类的类时,代码会与Spring紧密耦合,我会尽量避免使用这些类

只是因为我不确定您是否知道SessionFactory和Spring的HibernateTemplate之间的优缺点,这里有一篇来自SpringSource的很棒的博客文章,对它们进行了比较和分析:

以下是博客文章的最后一条建议:

因此,简而言之,正如HibernateTemplate和JpaTemplate的JavaDoc已经提到的那样,如果您开始在新项目上分别使用Hibernate或JPA,我建议您直接开始使用Session和/或EntityManager API–请记住:Spring尝试非侵入性,这是另一个很好的例子


我想说,您提供的示例并不严格依赖于Spring。您使用的唯一Spring组件是@Repository注释,它1充当@component,让您对类进行组件扫描,2使您的类符合数据访问转换的条件

这根本不是将您的实现与Spring耦合。相反,您使用的是Hibernate的会话工厂,并且与之耦合。您的实现与Hibernate结合在一起是可以的

事实上,这就是定义 接口,并具有不同的接口实现。在本例中,您有一个SpitterDAO接口和一个HibernateSpitterDAO实现。如果将来决定使用iBatis或Spring的HibernateTemplate或JDBCTemplate,则可以编写不同的实现

春天在大部分时间里都试图避开你。它主要用作管理依赖项注入的容器,实际上只是协调代码如何粘合在一起。我认为,当您有实现ApplicationSessionAware和BeanPostProcessor之类的类时,代码会与Spring紧密耦合,我会尽量避免使用这些类

只是因为我不确定您是否知道SessionFactory和Spring的HibernateTemplate之间的优缺点,这里有一篇来自SpringSource的很棒的博客文章,对它们进行了比较和分析:

以下是博客文章的最后一条建议:

因此,简而言之,正如HibernateTemplate和JpaTemplate的JavaDoc已经提到的那样,如果您开始在新项目上分别使用Hibernate或JPA,我建议您直接开始使用Session和/或EntityManager API–请记住:Spring尝试非侵入性,这是另一个很好的例子