【问题标题】:integrate hibernate with spring without spring dependency in dao在 dao 中将 hibernate 与 spring 集成而没有 spring 依赖
【发布时间】:2012-09-03 17:24:25
【问题描述】:

当我们将hibernate与spring集成时,我们通常实现@Repository spring注解使用的基于注解的方法。我了解到这样做的目的是为了消除我们 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。

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

我只是想一段时间后我们需要用其他东西切换弹簧。在那种情况下,如果我们的 DAO 与 spring 的依赖关系为零,我们根本不需要接触我们的 DAO。

【问题讨论】:

    标签: java spring hibernate


    【解决方案1】:

    要实现完全解耦,您必须摆脱注释,正如您已经发现的那样。要么,您必须使用 spring 基于 XML 的配置,或者您创建一个 @Configuration 类(也称为基于 java 的配置)来构建您的 bean 工厂。

    我只是想对你的想法发表评论。花时间在一个完全解耦的解决方案上,理由是“也许在未来的某个时候我们会想要切换”对我来说听起来像是浪费了很多时间。您是否有任何理由怀疑或假设这种转换将在可预见的将来完成,或者永远?你的去耦是有代价的,这很清楚。您必须维护 XML 文件和/或配置类,而不是易于查看的注释,这两者往往会变得相当复杂,并且在一段时间后难以概览。

    【讨论】:

      【解决方案2】:

      我会说您提供的示例紧密依赖于 Spring。您使用的唯一 Spring 组件是 @Repository 注释,它 1) 充当 @Component 并让您对类进行组件扫描,以及 2) 使您的类有资格进行数据访问转换 (Source)。

      这根本不是将您的实现与 Spring 耦合。相反,您使用的是 Hibernate 的会话工厂,并且您与它耦合。没关系,您的实现与 Hibernate 相结合。

      事实上,这就是定义接口并拥有不同实现的全部目的。在这种情况下,您有一个 SpitterDAO 接口和一个 HibernateSpitterDAO 实现。如果您将来决定使用 iBatis 或 Spring 的 HibernateTemplate 或 JDBCTemplate,您可以编写不同的实现。

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

      因为我不确定您是否了解 SessionFactory 和 Spring 的 HibernateTemplate 之间的优缺点,所以这里有一篇来自 SpringSource 比较和对比它们的精彩博文:http://blog.springsource.org/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor-jpatemplate/

      这是来自博客文章的最终建议的 sn-p:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-14
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        • 2021-02-28
        • 2011-01-27
        • 2010-12-07
        相关资源
        最近更新 更多