Spring中事務與aop的先後順序問題
阿新 • • 發佈:2019-01-07
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在事務介入之前就執行了!