1. 程式人生 > >Spring中事務與aop的先後順序問題

Spring中事務與aop的先後順序問題

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

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

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

    在事務配置的地方也配置order 欄位,程式碼如下:

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

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