簡體   English   中英

在沒有spring依賴的情況下將hibernate與spring集成在一起

[英]integrate hibernate with spring without spring dependency in dao

當我們將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注釋。 春天知道我們不能完全獨立嗎? 它更像是依賴於彈簧注釋比依賴於彈簧類更好,是嗎?

我只是想一段時間后我們需要用其他東西切換彈簧。 在這種情況下,如果我們的DAO與spring沒有任何依賴關系,我們根本不需要觸摸我們的DAO。

要實現完全解耦,您必須遠離注釋,就像您已經發現的那樣。 要么,您必須使用基於Spring的Spring配置,要么創建一個構建bean工廠的@Configuration類(也就是基於java的配置)。

我只想對你的想法發表評論。 將時間花在一個完全解耦的解決方案上的原因是“將來某個時候我們可能會想要切換”聽起來好像浪費了很多時間。 您是否有任何理由懷疑或假設在可預見的將來或將來會進行此類轉換? 你的去耦是有代價的,這是清晰的。 您需要維護XML文件和/或配置類,而不是易於查看的注釋,這些類文件和/或配置類在一段時間后都會變得相當復雜且難以概述。

我會說你提供的例子並不是嚴格依賴於Spring。 您正在使用的唯一Spring組件是@Repository注釋,其中1)充當@Component並讓您組件掃描該類,並且2)使您的類符合數據訪問轉換的條件( )。

這根本不是你的實現與Spring的結合。 相反,你正在使用Hibernate的會話工廠,你就是這樣。 你的實現與Hibernate相結合是可以的。

實際上,這是定義接口並具有不同實現的完整目的。 在這種情況下,您有一個SpitterDAO接口和一個HibernateSpitterDAO實現。 如果您決定將來使用iBatis或Spring的HibernateTemplate或JDBCTemplate,您可以編寫不同的實現。

春天試圖在大多數情況下避開你的方式。 它主要用作管理依賴注入的容器,實際上只是協調代碼如何“粘合在一起”。 我認為當你有類實現ApplicationSessionAware和BeanPostProcessor之類的類時,代碼會與Spring緊密結合,我會盡量避免使用它。

只是因為我不確定你是否知道SessionFactory和Spring的HibernateTemplate之間的優缺點,這里有一篇來自SpringSource的博客文章比較和對比它們: http//blog.springsource.org/2007/06/26/所以,應該任您還在使用,彈簧-的HibernateTemplate,安道爾,使用JpaTemplate /

以下是博文中的最終建議片段:

所以簡而言之(就像已經提到的HibernateTemplate和JpaTemplate的JavaDoc一樣)我建議你直接開始使用Session和/或EntityManager API,如果你開始分別在一個新項目上使用Hibernate或JPA - 記住:Spring嘗試要是非侵入性的,這是另一個很好的例子!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM