2012-09-03 15 views
1

當我們將hibernate與spring集成時,我們通常會使用@Repository spring註解來實現基於註解的方法。我學到的去爲它,爲了消除我們的DAO和從Hibernate支持的上下文session春依賴管理會話將hibernate與spring結合在一起,沒有彈簧對dao的依賴

@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。

回答

4

要實現完全解耦,您必須移除註釋,就像您已經發現的那樣。要麼你必須使用基於Spring的XML配置,要麼創建一個構建你的bean工廠的類(也就是基於java的配置)。

我只想對你的想法發表評論。花費時間在一個完全解耦的解決方案上,「可能在將來某個時候我們想要切換」的原因聽起來很浪費在我身上。您是否有任何理由懷疑或假設這樣的轉換將在可預見的將來完成,或曾經有過?清晰的解耦是需要花費的。除了易於查看的註釋之外,您還需要維護XML文件和/或配置類,這些類都會在一段時間後變得相當複雜並且很難概覽。

0

我會說你提供的例子是而不是緊緊依賴於Spring。你使用的唯一的Spring組件是@Repository註解,1)充當@Component並讓你組件掃描類,並且2)使你的類有資格進行數據訪問轉換(Source)。

這根本不是將你的實現耦合到Spring。相反,你使用的是Hibernate的會話工廠,你可以將其與之結合。沒關係,你的實現與Hibernate結合在一起。

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

春天試圖保持你的方式在大多數情況下。它主要用作管理依賴注入的容器,並且真正協調您的代碼如何「粘合在一起」。我認爲當你有類實現像ApplicationSessionAware和BeanPostProcessor這樣的類時,我會盡量避免代碼與Spring緊密結合。

而只是因爲我不知道,如果你知道的SessionFactory和Spring的HibernateTemplate的之間的利弊/利弊,這裏是從SpringSource的比較和constrasting他們一個偉大的博客文章:http://blog.springsource.org/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor-jpatemplate/

這裏是最後一個建議的片段從博客文章:

因此,在短期(如Java文檔的HibernateTemplate和使用JpaTemplate已經提到),我建議你開始使用會話和/或EntityManager的API直接,如果你開始使用Hibernate或JPA分別在一個新項目上記住:Spring試圖是非侵入式的,這是另一個偉大的例子mple!