除了基於XML的事務配置之外,Spring還提供了基於註解的事務配置,即通過@Transaction對需要事務增強的Bean接口實現類或方法進行標註,在容器中配置基於註解的事務增強驅動,即可啓用基於註解的聲明式事務。
使用@Transaction 註解
順着上面講的,使用@Transaction對基於 aop /tx 命名空間的事務配置進行改造,比較兩者的差異:
因爲註解本身具有一組普適性的默認事務屬性,所以往往只要爲需要事務處理的業務類添加一個@Transaction註解就完成了業務類事務屬性的配置。
當然,註解只是提供元數據,它本身並不能完成事務切面織入的功能。因此,還需要在Spring配件文件通過Spring 容器對標註@Transaction的Bean進行加工處理,如代碼:
默認情況下,<tx:annotation-driven>會自動使用名稱爲“transactionManager”的事務管理器,所以如果用戶的事務管理器id爲“transactionManager”,可以進一步將 ①
處的配置簡化爲<tx:annotation-driven/>。
<tx:annotation-driven> 還有另外兩個屬性:
1、proxy-target-class:可選項,默認值爲false,如果爲true,Spring
將通過創建子類來代理業務類,如果爲false,則使用基於接口的代理。如果使用子類代理,則需要在類路徑中添加CGLib.jar 類庫。
2、order:如果業務類除事務切面外,還需要織入其他的切面,則通過該屬性可以控制事務切面在目標連接點的織入順序。默認值:proxy。
關於@Transaction 的屬性
基於@Transaction註解的配置和基於XML的配置方式一樣,也擁有一組普適性很強的默認事務屬性,用戶往往直接使用這些默認的屬性就可以了。
- 事務傳播行爲:PROPAGATION_REQUIRED;
- 事務隔離級別:ISOLATION_DEFAULT;
- 讀寫事務屬性:讀/寫事務。
- 超時時間:依賴於底層的事務系統的默認值。
- 回滾設置:任何運行期異常引發回滾,任何檢查性異常不會引發回滾。
因爲這些默認設置在大多數情況下都是適用的,一般不需要手工設置事務註解的屬性,見下圖,當然,Spring允許通過手工設置屬性值覆蓋默認值。
@Transaction 註解可以被應用與接口定義和接口方法、類定義和類的public 方法上。但Spring 建議在業務實現類上使用@Transaction 註解,當然也可以在業務接口上使用@Transaction
註解。 但這樣會留下一些容易被忽視的隱患。因爲註解不能被繼承,所以業務接口中標註的@Transaction 註解不會被實現業務類繼承,如果通過以下的配置啓用子類代理:
<!-- 啓用事務註解 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
業務類不會添加事務增強,照樣工作在非事務的環境下。例如,如果使用子類代理,假設用戶爲IViewSpace接口標註了@Transaction 註解,其實現類ViewSpaceImpl 依舊不會啓用事務機制。
因此,Spring建議在具體業務類上使用@Transaction 註解。這樣,不管<tx:annotation-driven>
將 proxy-target-class 屬性值配置爲true 還是false ,業務類都會啓用事務機制。
在方法處使用註解:
方法處的註解會覆蓋類定義處的註解,如:
使用不同的事務管理器
在不同的方法上使用不同的事務管理器,可以在xml文件中配置這些個不同的事務管理器。
如:
XML文件中配置的事務管理器,如圖: