1. 程式人生 > >spring事務 xml配置與註解配置 順序

spring事務 xml配置與註解配置 順序

最近在開發中遇到一些問題,在配置xml事務後,又在具體service方法中配置註解,結果註解並不執行。
按我原來的理解是配置xml的目的是為了具體程式碼的簡潔,和大體的統一。而具體的方法如果有特殊的要求,應該執行配置註解。

但是我的理解並不太對。於是我做了一系列的測試。

第一次 首先我證明@Transactional註解到底有沒有執行,於是我測試了readOnly引數,外面的xml配置ture,裡面註解配置false。結果報錯了。說明了註解的方式執行了。注意這裡我xml和註解配置的是同一種事務。如果是不通型別事務那麼不會報錯。

結果看xml的優先順序更高。但是網上有很多文章證明是註解優先順序高。於是我繼續做實驗

第二次 我在xml配置是設定沒有事務,而註解配置了回滾事務,結果方法在報錯後回滾了。

結果看執行了註解,這注解優先順序又比xml高了。這裡我想無論是xml方式還是註解的方式,其實都是AOP,那麼兩種方式都執行了,而不是執行其中一個。執行了xml開始一個沒有事務,又執行了一個註解有事務,所以還是有事務。

第三次 我在xml配置是設定回滾事務,而在註解裡面配置了never事務(never:以非事務方式執行操作,如果當前事務存在則丟擲異常。)

結果是執行方法時,報錯回滾了,說明先執行了註解事務,後執行xml事務。那為什麼先載入註解事務呢?難道spring載入的順序?
我現在配置是

    <!-- 使用annotation註解方式配置事務 -->
<tx:annotation-driven transaction-manager="transactionManager" /> <!-- 使用JDBC事務 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="masterdataSource" /> </bean>
<!-- AOP配置事務 --> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="add*" propagation="NESTED" rollback-for="Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="modify*" propagation="NESTED" rollback-for="Exception"/> <tx:method name="edit*" propagation="NESTED" rollback-for="Exception"/> <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="save*" propagation="NESTED" rollback-for="Exception"/> <tx:method name="send*" propagation="NESTED" rollback-for="Exception"/> <tx:method name="get*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="query*" read-only="true"/> <tx:method name="search*" read-only="true"/> <tx:method name="select*" read-only="true"/> <tx:method name="count*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 配置AOP切面 --> <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* com.demo..service.*.*(..))"/> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/> </aop:config>

第四次 我換了順序,把tx:annotation-driven放在了xml配置後面

結果 never報錯了。原因就是這回先載入xml配置設定了一個回滾事務。又載入註解的never事務報錯了,因為已經存在事務了。難道就看誰寫前面?一定有預設引數吧!是的,有

<!-- 使用annotation註解方式配置事務 order為優先順序 -->
<tx:annotation-driven transaction-manager="transactionManager"  order="1"/>

<!-- AOP配置事務 order為優先順序-->
<aop:config>
    <aop:pointcut id="transactionPointcut" expression="execution(* com.wkb..service.*.*(..))"/>
    <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" order="0" />
</aop:config>

總結:
xml配置與註解配置都執行,預設順序誰先載入誰先執行,指定執行順序 新增order引數
建議:
應該先執行xml 後 執行註解
xml 配置的是統一的。但是可能我想在具體的方法裡搞特殊,就自己加註解
例如xml配置了REQUIRED回滾 而我的具體的方法不想回滾但是還要用insert開頭,就可以在註解配置

@Transactional(propagation=Propagation.PROPAGATION_NOT_SUPPORTED, noRollbackFor=Exception.class)

這樣所有的insert開頭的都有回滾事務,就這個加註解的沒有。

相關推薦

spring事務 xml配置註解配置 順序

最近在開發中遇到一些問題,在配置xml事務後,又在具體service方法中配置註解,結果註解並不執行。 按我原來的理解是配置xml的目的是為了具體程式碼的簡潔,和大體的統一。而具體的方法如果有特殊的要求,應該執行配置註解。 但是我的理解並不太對。於是我做了一

Spring介紹及配置(XML文件配置註解配置)

處理 tis 配置文件 3.0 span 特點 inverse logging 結構 本節內容: Spring介紹 Spring搭建 Spring概念 Spring配置講解 使用註解配置Spring 一、Spring介紹 1. 什麽是Spring

Spring Boot 中使用 @Transactional 註解配置事務管理

all arc obj 資料 ror 科學 部分 直接 true 事務管理是應用系統開發中必不可少的一部分。Spring 為事務管理提供了豐富的功能支持。Spring 事務管理分為編程式和聲明式的兩種方式。編程式事務指的是通過編碼方式實現事務;聲明式事務基於 AOP,將具體

spring 配置的三種方式:XML配置,JAVA配置註解配置

是否有了這些 IOC 註釋,我們就可以完全摒除原來 XML 配置的方式呢?答案是否定的。有以下幾點原因:註釋配置不一定在先天上優於 XML 配置。如果 Bean 的依賴關係是固定的,(如 Service 使用了哪幾個 DAO 類),這種配置資訊不會在部署時發生調整,那麼註釋配

Spring Boot 中使用 @Transactional 註解配置事務管理(轉載)

事務管理是應用系統開發中必不可少的一部分。Spring 為事務管理提供了豐富的功能支援。Spring 事務管理分為程式設計式和宣告式的兩種方式。程式設計式事務指的是通過編碼方式實現事務;宣告式事務基於 AOP,將具體業務邏輯與事務處理解耦。宣告式事務管理使業務程式碼邏輯不受汙

web.xml註解配置servlet使用介紹

Servlet3.0是Java EE6規範的一部分所以說使用註解需要在JAVA EE6以上 (Tomact7.0全面支援註解) 配置Servlet類 web.xml配置方法 <servl

Spring註入方式及註解配置

配置文件 set方法 分享 lec clas 自定義 ima setname etx 一:基於xml的DI(Dependency Injection) 註入類型: 定義學生Student實體類和小汽車Car實體類:進行封裝和生成ToString(),並自定義屬性Car

Spring完全基於Java和註解配置

進行 要點 servle containe one targe 引入 logs pos 要點: 配置繼承WebApplicationInitializer的類作為啟動類,相當於配置web.xml文件 使用@Configuration註解一個類,在類中的方式使用@Bean註

Spring Boot中使用MyBatis註解配置詳解(1)

sql type .org 實體 sch 整合 PE 匯總 同傳 之前在Spring Boot中整合MyBatis時,采用了註解的配置方式,相信很多人還是比較喜歡這種優雅的方式的,也收到不少讀者朋友的反饋和問題,主要集中於針對各種場景下註解如何使用,下面就對幾種常見的情況舉

mybatis的xml配置註解配置

mybatis 註解配置xml配置 spring-application.xml <?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

Spring自動裝配Bean——xml方式註解方式

自動裝配的概念 在Spring使用中,我們在xml配置檔案通過元素或元素的ref屬性向bean注入另外的依賴bean。 如果使用自動裝配(autowiring) ,就可以減少甚至消除配置元素和元素。 設定元素的autowire屬性就可以設定bean的自動裝配模式。自動裝配有5種模式。

Spring Boot中使用MyBatis註解配置開發詳解

Spring Boot中使用MyBatis註解配置詳解 原創   2018-04-03 宗野       Spring Boot 最近專案原因可能會繼續開始使用

spring+memcache配置+快取註解配置

spring+memcache配置快取註解@cahceable等 1.增加memcache pom檔案 <dependency> <groupId>com.googlecode.xmemcached</group

Spring 進階(8)使用註解配置bean(4)

新的一天哈,寫了個新的例子。package interface_package; public interface Animal { public void Bigger(String name); } package class_package; import interfa

Spring 進階(7) 使用註解配置bean(3)

這裡主要介紹自動裝配和精確裝配 自動裝配可以通過@Autowired註解,被這個註解修飾的方法會在容器中找和id和引數名字一樣的bean,然後把它裝配進去。需要 指出的是,當容器中有大於一個bean符合條件的話,會丟擲異常,當有大於一個bean符合條件的話,spring什麼也

Spring 進階(6) 使用註解配置bean(2)

太長了,分開寫吧,到使用註解定製宣告週期了。 和前面使用init-method和destory-method方法來指定初始化之後使用那個方法和銷燬前使用哪個方法一樣,使用@PostConstruct和@PreDestory註解也可以達到同樣的效果。 這裡是在上個例子的基礎上修改的。

Spring 進階(5) 使用註解配置bean(1)

可以在為類配置註解,然後在配置檔案中指定哪一個包下有註解的類都註冊成java bean,spring沒有使用約定由於配置的做法,根據註解配置bean的類的路徑要顯式指定。 要特別指出的是,這些通過註解的bean,spring給他們的id是將類名全部改成小寫字母 天道酬勤,來吧pac

Spring Boot中使用MyBatis註解配置詳解

   轉自翟永超 之前在Spring Boot中整合MyBatis時,採用了註解的配置方式,相信很多人還是比較喜歡這種優雅的方式的,也收到不少讀者朋友的反饋和問題,主要集中於針對各種場景下註解如何使用,下面就對幾種常見的情況舉例說明用法。 在做下面的示例之前,先準備一

Hibernate 教程(二)[Hibernate物件的操作,xml配置註解配置]

準備 資料庫建表(Hibernate可以自動生成表,和對應欄位,但是不能給欄位添加註釋,所以選擇手動建表) -- 建立表 CREATE TABLE `Event`( `id` INT AUTO_INCREMENT COMMENT '唯一標識', `title` VARC

Spring Boot 熱部署日誌配置

熱部署和日誌是開發中常用的功能,Srping Boot同樣集成了相應的工具,可以方便地實現這些功能。 熱部署 Spring Boot提供了 spring-boot-devtools 模組用於熱部署,直接引入就行 <dependency>