【原文鏈接】
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在事務介入之前就執行了!