在Spring的參考手冊中,提到了Spring所提供的DAO支援,主要提到了org.springframework.dao下所提供的一致性例外類別,以及DaoSupport相關類別。
首先來瞭解例外處理,Java的例外分為checked與runtime例外,checked例外是可以在程式中處理並恢復至程式可執行的狀態,例如您希望獲取的是數字字元,然而使用者輸入了非數字的字元,這會造成數字字元剖析為int、double等數值形態時的例外,而這種例外是可以被捕捉處理,並回覆使用者一個提示訊息,然後回到重新輸入的狀態,對於checked例外,編譯器在語法檢查階段會要求使用 try..catch 區塊來包括處理,或者是在例外發生的方法上聲明throws,由呼叫方法的物件來處理。
runtime例外通常是比較嚴重的例外情況,編譯器並不會強迫您處理這類型例外,程式設計人員可以選擇處理它,或者是不處理它,在例外真的發生時,讓例外直接丟出至最上層處理,像是Container。
checked例外的立意本來是好的,對於這類例外發生時,我們希望的是處理至讓程式可以運作,而不是重新啟動程式,然而有時候,對於checked例外,我們往往是無能為力,例如無法取得資料庫連線這類的事。
另一方面,一些程式會自行繼承相關的例外類別,包括一些相關的例外訊息,它們也會在定義介面時於方法上聲明throws某些類型的例外,然而如果我們在這些方法中發生了某些不是方法聲明的例外(可能由於使用的底層技術不同而有這種情況,像是JDBC或是Hibernate),我們就無法將之throw,只能自行撰寫一些try..catch來暗自處理掉,如果想要讓這些例外丟出至上層,就要更多道的手續了。
以下摘錄Rod Johnson自己對例外處理的看法:
代碼:
Data access exceptions not usually recoverable. For example, if we can't connecct to the database, a particular business object is unlikely to be able to work around the problem.
One potential exception is optimistic locking violations, but not all applications use optimistic locking. It's usually bad to be forced to write code to catch fatal exceptions that can't be sensibly handled.
Letting them propagate to top-level handlers like the servlet or EJB container is usually more appropriate. All Spring data access exceptions are subclasses of DataAccessException, so if we do choose to catch all Spring
data access exceptions, we can easily do so.
Spring提供一個簡單的DAO例外處理層次,適用於各種資料存取策略,對於JDBC存取,Spring將SQLException等轉化為自己的DAO例外物件,dao包下提供一致性的例外處理層次,DataAccessException是這個層次的基礎類別,它繼承自core包的NestedRuntimeException,而NestedRuntimeException繼承自RuntimeException,對於一些例外,您可以選擇處理它,或者忽略它,由最上層的Container來處理。
您可以看看參考手冊中的DAO support一章,當中有一些對例外處理的說明,也有個DataAccessException的類別繼承圖。
在DAO的支援上,為了方便您撰寫DAO物件及以一致性的方式來管理相關的資源,Spring提供了一些抽象類別可以直接使用,像是JdbcDaoSupport、HibernateDaoSupport、JdoDaoSupport等,分別用於JDBC或不同的持久層訪問技術,JdbcDaoSupport需要設定DataSource,本身提供JdbcTemplate等的資源管理存取介面,HibernateDaoSupport需要設定SessionFactory,提供HibernateTemplate等的資源管理存取介面,同樣的,JdoDaoSupport需要設定PersistenceManagerFactory,提供JdoTemplate等的資源管理存取介面。