2012-04-05 103 views

回答

41

沒有區別儘量就像春天一樣。按照慣例,您可以使用@Repository標記DAO類,並使用@Service標記服務。前者也進行一些持久層異常翻譯。

由於您在理論上提出:DAO應該執行原始數據庫操作並將它們轉換爲一些更高級別的構造(對象,集合)。服務應該調用DAO並執行業務操作。通常,在服務層上執行事務分界以跨越幾個DAO調用。

最後,DAO應該將業務邏輯從持久性細節中抽象出來,理想情況下允許在沒有業務邏輯(服務)更改的情況下切換持久層。由於泄漏了持久化提供者的抽象(例如延遲加載),所以這幾乎不可能。

10

DAO - 數據訪問對象,是處理與數據存儲(典型數據庫)連接的對象。你在這裏有你的查詢和DAO提供數據給你的服務。

服務應該包含您的所有邏輯。如果你有邏輯分離,你理論上可以改變你的UI層或DAO層,而不會影響它。

4

DAO(數據訪問對象)是一種設計模式,其由上創建的數據庫中的類上的每個表中,提供了一種技術,用於分離對象的持久性和數據訪問邏輯

0

雖然已經問了這個問題已經很多年了,但還是有人(像我一樣)想知道這個問題的答案。除了上面的答案,我想分享我發現的東西:

在爲Spring學習者編寫的許多基本的基於Spring的代碼中,數據只是從數據庫存儲和讀取。 DAO注入SessionFactory。然後我們看到服務似乎在做同樣的事情。新的學習者想知道爲什麼我們有兩個類似的界面和類 - dao和服務。

但是在真實世界的應用程序中,可以存在其他並行類型的數據存儲(例如,一種數據可以存儲在數據庫中,而一些其他類型的數據存儲在文件或其他存儲類型中可以用於給定的時間點)。

而在這種情況下,控制器類將不得不注入許多不同類型的接口(一個使用數據庫,其他使用文件和其他一些接口)。如果有移動應用程序使用相同的數據源,那麼移動應用程序也會設置所有不同類型的數據源。

所以不要這樣做,當使用服務時控制器類,移動應用程序等只能使用服務,服務可以與我們擁有的任意數量的數據持久性源一起工作。當在數量或數據源的持久性改變所有也將在受影響的DAO和服務,因此,控制器,移動應用做等將不會受到影響類型的改變

後來 - 他們將繼續使用相同的服務。

所有這些都明顯減少了要完成的工作量。

有一個門面設計模式,推薦這樣的設置作爲更好的設計。

您可以這篇大文章中看到的這個偉大的圖形表示:

https://springframework.guru/gang-of-four-design-patterns/facade-pattern/

所以,儘管在基本春基於應用與一個數據源正在使用的唯一的Web應用程序的用戶(控制器)在真實DAOs和Service之間的生活情景區分變得明顯。

希望這會有所幫助。