【轉】Spring中事務與aop的先后順序問題


【原文鏈接】

http://my.oschina.net/HuifengWang/blog/304188

 

【正文】

    Spring中的事務是通過aop來實現的,當我們自己寫aop攔截的時候,會遇到跟spring的事務aop執行的先后順序問題,比如說動態切換數據源的問題,如果事務在前,數據源切換在后,會導致數據源切換失效,所以就用到了Order(排序)這個關鍵字。

步驟01:
    我們可以通過在@AspectJ的方法中實現org.springframework.core.Ordered 這個接口來定義order的順序,order 的值越小,說明越先被執行。比如代碼如下:

 1 /**
 2  * @author HuifengWang
 3  * aop面向切面編程
 4  *
 5  */
 6 @Component
 7 @Aspect
 8 public class AspectJ4DataBase implements Ordered{
 9     
10     //攔截所有的service操作
11     @Pointcut("execution( * com.hc.shop.*.service.*.*(..))")
12     public void readMethod() {
13     }// 匹配所有的讀取操作
14     
15     @Before("readMethod()")
16     public void onlyReadPre(){
17         DataSourceContextHolder.setDataSourceType(DataSourceType.MYSQL);
18         System.out.println("數據庫切換MYSQL");
19     }
20     @After("readMethod()")
21     public void onlyReadPast(){
22         DataSourceContextHolder.setDataSourceType(DataSourceType.ORACLE);
23         System.out.println("數據庫切換回ORACLE");
24     }
25 
26     @Override
27     public int getOrder() {
28         // TODO Auto-generated method stub
29         return 1;
30     }
31 }

 

步驟02:

在事務配置的地方也配置order 字段,代碼如下

1 <!-- 注解方式配置事物 -->
2 <tx:annotation-driven transaction-manager="transactionManager" order="2"/>

 

這樣就實現了我們自己寫的aop在事務介入之前就執行了!


免責聲明!

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



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