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

       Spring中的事務是經過aop來實現的,當咱們本身寫aop攔截的時候,會遇到跟spring的事務aop執行的前後順序問題,好比說動態切換數據源的問題,若是事務在前,數據源切換在後,會致使數據源切換失效,因此就用到了Order(排序)這個關鍵字.java

        咱們能夠經過在@AspectJ的方法中實現org.springframework.core.Ordered 這個接口來定義order的順序,order 的值越小,說明越先被執行。好比代碼以下:spring

/**
 * @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 字段,代碼以下:數據庫

    

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

這樣就實現了咱們本身寫的aop在事務介入以前就執行了!編程

相關文章
相關標籤/搜索