spring 基於注解的聲明式事務注解配置和 aop xml配置優先級【轉】


一般來說,我們百度的時候, 配置 基於注解的聲明式事務注解一般是

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

其實是沒有錯的,但是 這樣是不全,很可能 會使 事務 沒起效果的。

由於采用的是SpringMVC、 MyBatis,故統一采用了標注來聲明Service、Controller 由於服務器啟動時的加載配置文件的順序為web.xml---root-context.xml(Spring的配置文件)---servlet-context.xml(SpringMVC的配置文件),由於  

root-context.xml配置文件中Controller會先進行掃描裝配,但是此時service還沒有進行事務增強處理,得到的將是原樣的Service(沒有經過事務加強處理,故而沒有事務處理能力),所以我們必須在root-context.xml中不掃描Controller,配置如下:  

 

 <!-- 自動掃描組件,這里要把controler下面的 controller去除,他們是在spring3-servlet.xml中配置的,如果不去除會影響事務管理的。 -->  
     <context:component-scan base-package="com.sence">  
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />   
     </context:component-scan>  

在servlet-context.xml中掃描Controller同時不掃描Service,配置如下:

<!-- 掃描所有的controller 但是不掃描service-->  
    <context:component-scan base-package="com.sence">  
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />  
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />  
    </context:component-scan>

原作者說他測試過了,如果 掃描的時候 不 進行 對應的包掃描的配置, 注解事務,也是沒有起到回滾的 作用的。 需要加上 包的掃描的配置的。

以上都加上了,那么有一個問題了。 如果 我們 使用 基於 xml 的 aop 的事務配置了之后, 那么又在 方法或者 類上使用了事務注解, 哪個優先級更高 ?原作者的測試結果是 : 事務注解的優先級更高 。 如果由於自定義的AOP ,產生異常的時候,可能會使事務注解沒有產生回滾,或者造成影響。 百度的結果是 : 配置事務注解的優先級,默認是優先級最低的。

<!-- 開啟事務控制的注解支持,proxy-target-class="true"類代理適用范圍廣 -->
     <!-- order 一般是不用配置的,如果aop xml 配置了事務了,代碼又使用了事務的注解,那么以代碼的注解為主。 帶上order 是防止以后代碼上有其他自定義的AOP 而影響了事務注解的aop的異常的事務回滾,默認事務注解的aop的優先級最低。 加上也是為了明確告訴spirng 聲明式事務注解優先級最高。 -->  
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" order="200"/>

注解用法:

@Transactional 可以作用於接口、接口方法、類以及類方法上。當作用於類上時,該類的所有 public 方法將都具有該類型的事務屬性,同時,我們也可以在方法級別使用該標注來覆蓋類級別的定義。

雖然 @Transactional 注解可以作用於接口、接口方法、類以及類方法上,但是 Spring 建議不要在接口或者接口方法上使用該注解,因為這只有在使用基於接口的代理時它才會生效。另外, @Transactional 注解應該只被應用到 public 方法上,這是由 Spring AOP 的本質決定的。如果你在 protected、private 或者默認可見性的方法上使用 @Transactional 注解,這將被忽略,也不會拋出任何異常。

默認情況下,只有來自外部的方法調用才會被AOP代理捕獲,也就是,類內部方法調用本類內部的其他方法並不會引起事務行為,即使被調用方法使用@Transactional注解進行修飾。

 

原文出處:http://www.voidcn.com/article/p-oysgzmnx-boy.html




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM