轉載:原文網址 http://robinsoncrusoe.iteye.com/blog/805731spring
概述
【IT168 專稿】近幾年持久化技術領域異常喧囂,各類框架雨後春筍般地冒出,Sun也鏈接不斷地頒佈幾個持久化規範。Spring對多個持久化技術提供了集成的支持,包括 Hibernate、iBatis、JDO、JPA、TopLink,此外,還經過Spring JDBC框架對JDBC API進行簡化。Spring面向DAO制定了一個通用的異常體系,屏蔽具體持久化技術的異常,使業務層和具體的持久化技術達到解耦。此外,Spring 提供了模板類簡化各類持久化技術的使用。通用的異常體系及模板類是Spring整合各類五花八門持久化技術的不二法門,Spring不但藉此實現了對多種持久化技術的整合,還能夠不費吹灰之力整合潛在的各類持久化框架,體現了「開-閉原則」的經典應用。
Spring的DAO理念
DAO(Data Access Object)是用於訪問數據的對象,雖然咱們在大多數狀況下,將數據保存在數據庫中,但這並非惟一的選擇,你也能夠將數據存儲到文件中或LDAP中。 DAO不但屏蔽了數據存儲的最終介質的不一樣,也屏蔽了具體的實現技術的不一樣。
早期,JDBC是訪問數據庫的主流選擇,近幾年,數據持久技術得到了長足的發展,Hibernate、iBatis、JPA、JDO成爲持久層中爭放異彩的實現技術。只要爲數據訪問定義好DAO接口,並使用具體的技術實現DAO接口的功能,你就能夠在不一樣的實現技術間平滑的切換。
圖 1 業務層經過DAO接口訪問數據
圖 1是一個典型的DAO應用實例,在UserDao中定義訪問User數據對象的接口方法,業務層經過UserDao操做數據,並使用具體持久技術實現UserDao接口方法,這樣業務層和具體持久化技術就實現瞭解耦。
提供DAO層的抽象能夠帶來一些好處,首先,咱們能夠很容易地構造模擬對象,方便單元測試的開展,其次在使用切面時,咱們有更多的選擇:既可使用JDK動態代理也可使用CGLib動態代理。
Spring本質上但願以統一的方式整合底層的持久化技術:以統一的方式進行調用及事務管理,避免讓具體的實現侵入到業務層的代碼中。因爲每一個持久化實現 技術都有各自的異常體系,因此Spring提供了統一的異常體系,使不一樣異常體系的阻抗得以彌消,方便定義出和具體實現技術無關的DAO接口,以及整合到相同的事務管理體系中。
統一的異常體系
統一的異常體系是整合不一樣的持久化實現技術的關鍵,Spring提供了一套和實現技術無關的、面向於DAO層次語義的異常體系,並經過轉換器將不一樣的持久化技術異常轉換成Spring的異常。
Spring的DAO異常體系
在不少正統API或框架中,檢查型異常被過多的使用,以致在使用API時,代碼裏充斥着大量的try/catch樣板式的代碼。在不少狀況下,除了在 try/catch中記錄異常信息之外,咱們並無作多少實質性的工做。引起異常的問題每每是不可恢復的,如數據鏈接失敗,SQL語句存在語法錯誤,強制捕捉的檢查型異常除了限制開發人員的自由度之外,並無提供什麼有意義的做用。所以,Spring的異常體系都是創建在運行期異常的基礎上,開發者能夠根據須要捕捉感興趣的異常。
JDK不少API之因此難用,一個很大的緣由就是檢查型異常的泛濫,如JavaMail、EJB以及JDBC等等,使用這些API,一堆堆異常處理的代碼 喧賓奪主式地侵入業務代碼中,破壞了代碼的整潔和優雅。數據庫
Spring在org.springframework.dao包中提供了一套完備優雅的DAO異常體系,這些異常都繼承於 DataAccessException,而DataAccessException自己又繼承於 NestedRuntimeException,NestedRuntimeException異常以嵌套的方式封裝了源異常。由於雖然不一樣持久化技術的特定異常被轉換到Spring的DAO異常體系中,原始的異常信息並不會丟失,只要你願意,就能夠方便地經過getCause()方法獲取原始的異常信息。
Spring的DAO異常體系並不和具體的實現技術相關,它從DAO概念的抽象層面定義了異常的目錄樹。在全部的持久化框架中,咱們並無發現擁有如此豐富語義異常體系的框架,Spring這種設計無疑是獨具匠心的,它使得開發人員關注某一特定語義的異常變得容易。在JDBC中的SQLException 中,你必須經過異常的getErrorCode()或getSQLState()獲取錯誤代碼,直接根據這些代碼判斷是錯誤的類型,這種過於底層的API 不但帶來了代碼編寫上的難度,並且也使代碼的移植變得困難,由於getErrorCode()是數據庫相關的。
Spring以分類手法創建了異常分類目錄,對於大部分應用來講,這個異常分類目錄對異常類型的劃分具備適當的顆粒度。一方面,使開發者從底層細如針麻的 技術細節中脫身出來,另外一方面,能夠從這個語義豐富的異常體系中選擇感興趣的異常加以處理。圖 2列出了那些位於Spring DAO異常體系第一層次的異常類,每一個異常類下還可能擁有衆多的子異常
緩存
數據訪問對象DAO簡介 app