1、Spring 對 DAO的支持
Spring支持目前大多數(shù)常用的數(shù)據(jù)持久化技術,Spring定義了一套面向DAO層的異常體系,并未各種支持的持久化技術提供了異常轉換器。這樣,我們在設計DAO接口時,就可以拋開具體的實現(xiàn)技術,定義統(tǒng)一的接口。
不管采用 何種持久化技術,訪問數(shù)據(jù)的流程是相對固定的。Spring將數(shù)據(jù)訪問流程劃分為固定和變化兩個部分,并以模板的方式定好流程,用回調接口將變化的部分開放出來,留給開發(fā)者自行定義。這樣,我們僅需要提供業(yè)務相關的邏輯就可以完成整體的數(shù)據(jù)訪問了。
Spring為了進一步簡化持久模板類的使用,為各個持久化技術提供了便捷的支持類,支持類不但包含數(shù)據(jù)訪問模板,還包含數(shù)據(jù)源或會話等內容。通過擴展支持類定義自己的數(shù)據(jù)訪問類是最簡單的數(shù)據(jù)訪問方式。
不管采用何種持久化技術,都需要定義數(shù)據(jù)源。在實際部署中,我們可能會采用應用服務器本身提供的數(shù)據(jù)源,這時,則可以通過JndiObjectFactoryBean或jee命名空間引用JNDI中的數(shù)據(jù)源。
2、Spring的事務管理
Spring使聲明式事務平民化,事務作為一個切面織入到目標業(yè)務方法的周圍,業(yè)務方法完全從事務代碼中解脫出來,代碼的復雜度大大降低。被織入的事務代碼基于Spring事務同步管理器進行工作,事務同步管理器維護著業(yè)務類對象線程相關資源。DAO類需要利用資源獲取工具訪問底層數(shù)據(jù)連接,或者直接建立在相應持久化模板類的基礎上。
Spring的事務配置主要提供兩方面的信息:其一,切點信息,用于定位實施事務切面的業(yè)務類方法;其二,控制事務行為的事務屬性,這些屬性包括事務隔離級別、事務傳播行為、超時時間、回滾規(guī)則。
3、Spring事務管理難點剖析
在沒有事務管理的情況下,DAO照樣可以順利進行數(shù)據(jù)操作;
將應用分為Web、Service及DAO層只是一種參考的開發(fā)模式,并非是事務管理工作的前提條件;Spring通過事務傳播機制可以很好地應對事務方法嵌套調用的情況,開發(fā)者無須為了事務管理而可以改變服務方法的設計;
經(jīng)過事務管理增強的到實例Bean不存在線程安全問題,可以很好地工作在多線程環(huán)境下;
混合使用多個數(shù)據(jù)訪問框架的最佳組合是一個ORM技術框架(Hibernate 或 JPA)+ 一個JDBC技術框架(Spring JDBC 或 iBatis)。直接使用ORM技術框架對應的事管理器就行了,但必須考慮ORM緩存同步問題;
Spring AOP增強有兩個方案:其一是基于接口的動態(tài)代理,其二為基于CGLib動態(tài)生成子類的代理。由于Java語言的特性,有些特殊方法不能被Spring AOP代理,所以無法享受AOP織入到來的事務增強;
使用Spring JDBC時如果直接使用Connection,可能會造成連接泄漏。為降低連接泄漏的可能性,盡量使用DataSourceUtils獲取數(shù)據(jù)連接。也可以對數(shù)據(jù)源進行代理,以便數(shù)據(jù)源擁有感知事務上下文的能力;
4、使用Spring JDBC訪問數(shù)據(jù)庫
- JdbcTemplate 使用大量的回調接口完成數(shù)據(jù)的訪問操作,StatementCallback、PreparedStatementCallback、CallableStatementCallback、BatchPreparedStatementSetter以及RowMapper是其中常用的回調接口,一般可以通過匿名內部類實現(xiàn)這些回調接口,使代碼更加緊湊;
5、整合其他ORM框架
Sprng為其所支持的ORM框架提供方便易用的FactoryBean用以創(chuàng)建ORM框架的基礎設施。Spring通過模板類在不損失框架功能的前提下大大降低了使用這些ORM技術的難度。但也允許用戶使用框架原生的API構造DAO,使用原生API時,Spring能保證用戶獲取到事務綁定的資源,Spring的事務管理機制同樣有效;
具體的應用一般會定義一個項目級的DAO基類,簡化接口方法、添加泛型支持,一個設計良好的DAO積累可以大大減少DAO層整體代碼的總量,提高項目開發(fā)效率。