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在事务介入以前就执行了!编程

相关文章
相关标签/搜索