擴展Spring(2) ---Spring對各種數據訪問框架的集成機制
何為數據框架集成。
數據訪問框架原本好好的,Spring都干了什么呢?
一是用template類封裝了數據框架那些資源獲取和異常事務處理的廢話代碼,而且按照自己的意見給出一些增強函數。
二是將其納入了Spring的聲明式事務管理中。
對比Spring對Hibernate、JDBC的集成,還有
Spring Modules對
O/R Broker的集成,發現Spring的DAO框架主要有六個類:
1.Template 著名的Template類,用callback機制封裝了除業務代碼外的所有必要但廢話的代碼,重新封裝了數據框架的API,并再附送一些增強版。
2.TransactionManager
實現PlatformTransactionManager接口,數據訪問框架就能與Spring的事務機制(TransactionTemplate或AOP聲明式事務)結合。
重要的類僅以上兩個,以下的類都只有少量標準代碼,完全可以忽略。
3.DAOSupport
實際DAO類的基類,負責保持template變量。如果你覺得它破壞了你的類層次結構,完全可以不用。
4.Accessor
template類的基類,defining common properties like DataSource and exception translator,也沒大用。
5.Operations
template所實現的接口,定義template支持的數據訪問函數和增強函數,template有多個實現時才有用。
6.Exception Translate的相關類和函數
異常翻譯,Spring DAO很重視的一個功能。
Template類的代碼
因為Hibernate本身很復雜,所以HibernateTemplate也不適合畏高暈車的人士如我觀看。JDBC簡單很多,但JDBCTemplate又忙著增強JDBC的功能,多出好多代碼。所以我選O/R broker的集成代碼來看,代碼一共才280行。
注:如果不熟O/R broker,可以簡單的認為broker=connection, executable = statement ,其余一切同Jdbc。
1.1主干函數 Execute(BrokerCallback action) step1. 獲得Connection-- connecton = datasource.getConn();
step2. 準備Statement -- statement = new Statement(connection);
step3. 執行Action的回調函數doInBroker(Statement)。這個doInBroker()方法由客戶定義,會拿著傳入的statement,執行種種操作。
try
{
action.doInBroker(statement );
}
catch(
)
{
//
翻譯異常
}
1.2 template的API函數 雖然理論上大家可以直接使用execute(),在匿名內部類里調用數據訪問框架的任何API。但java的匿名內部類不比閉包,代碼難看無比,所以除了Robbin還沒見到其他兄弟提倡直接用execute方法的。
因此,template也對數據框架的API進行了wrap,封裝了用execute(StatementCallback action)來執行這些API的函數,如下段就是wrap 了O/R Broker的execute(String statementID.....)方法:
public int execute(final String statementID, final String[] paramNames, final Object[] values) throws DataAccessException {
return executeWithIntResult(new BrokerCallback() {
public Object doInBroker(Executable executable) throws BrokerException {
applyNamedParamsToExecutable(executable, paramNames, values);
return new Integer(executable.execute(statementID));
}
});
}
另外還提供一些增強型、便利型的API(如selectOne() ,selectMany()),在參數、返回值上極盡變化。
TransactionManager的代碼
比較復雜,一下說不清。但JDBC的DatasourceTransactionManager和Hibernate的HibernateTransactionManager的代碼都很相近,說明這個TransactionManager其實也比較固定埋頭狂抄就是了。
有興趣的同學,可以響應某大老號召,實現ofbiz與spring的集成:)
系列文章:
Spring 的微內核與FactoryBean擴展機制 擴展Spring(2)--Spring對各種數據訪問框架的集成機制