正如第二版,Spring 僅支持 iBatis2。那麼我們就想將 MyBatis3 的支持加入到 Spring3.0(參考 Spring 的 Jira 的問題)中。
不幸的是,Spring 3.0 的開發在 MyBatis 3.0 官方發佈前就結束了。因爲Spring開發團隊不想發佈一個基於非發行版的MyBatis的整合支持,
那麼 Spring官方的支持就不得不等到至少 3.1 版本了。要在 Spring 中支持 MyBatis,MyBatis 社區認爲現在應該是自己團結貢獻者和有興趣的人
一起來開始進行 Spring 和 MyBatis 整合的時候了。 這個小類庫就來創建丟失的粘貼 Spring 和 MyBtatis 這兩個流行框架的膠水。
減少用戶不得不來配置MyBatis和Spring 3.X上下文環境的樣板和冗餘代碼。 它還透明地增加了 Spring對 MyBatis 事務的支持。
所以儘管MyBatis3提供了對Spring的整合,但是org.springframework.jdbc.datasource.DataSourceTransactionManager這個事務管理器還是不支持
aop的事務管理方式,如果你還想設置你的事務的隔離級別、只讀(PROPAGATION_REQUIRED、ISOLATION_DEFAULT、readOnly、timeout)。
那麼你可以使用org.springframework.transaction.interceptor.TransactionProxyFactoryBean這個事務攔截器的代理工廠。它還是可以完成的,但是當然不會
有HibernateTransactionManager那樣的完美,因爲DataSourceTransactionManager不能使用aop來管理我們的事務。
基本配置如下:
<-- 配置事務管理器,注意這裏的dataSource和SqlSessionFactoryBean的dataSource要一致,不然事務就沒有作用了 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<-- 配置事務的傳播特性 -->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="edit*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>
<prop key="*">readOnly</prop>
</props>
</property>
</bean>
然後,你需要配置的是對那個類的進行攔截器事務管理,就就需要設置這個接口的parent屬性爲baseTransactionProxy,target是該接口的實現類。如下:
<-- 爲AccountBiz接口配置事務攔截器,baseTransactionProxy是事務攔截器,在Controller中獲取這個對象 -->
<bean id="accountBiz" parent="baseTransactionProxy">
<-- 設置target,也就是AccountBiz的實現類 -->
<property name="target" ref="accountBizImpl"/>
</bean>
上面的accountBiz是一個接口,它的實現類的id是accountBizImpl。然後你在Struts或SpringMVC中注入accountBiz這個接口即可使用裏面的方法了。
糟糕的是,你需要爲所有需要事務管理的類或接口都要進行這個配置!也許你可以配置一個BaseBiz的parent是baseTransactionProxy,然後所有要進行
事務管理的接口或類,繼承或實現BaseBiz這個接口。不妨可以嘗試一番!