擴展Spring(2) ---Spring對各種數據訪問框架的集成機制

     何為數據框架集成。
   數據訪問框架原本好好的,Spring都干了什么呢?
   一是用template類封裝了數據框架那些資源獲取和異常事務處理的廢話代碼,而且按照自己的意見給出一些增強函數。
   二是將其納入了Spring的聲明式事務管理中。

    對比Spring對Hibernate、JDBC的集成,還有Spring ModulesO/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對各種數據訪問框架的集成機制