Spring中事务与aop的先后顺序问题

原创
2014/08/19 10:36
阅读数 3.1W

       Spring中的事务是通过aop来实现的,当我们自己写aop拦截的时候,会遇到跟spring的事务aop执行的先后顺序问题,比如说动态切换数据源的问题,如果事务在前,数据源切换在后,会导致数据源切换失效,所以就用到了Order(排序)这个关键字.

        我们可以通过在@AspectJ的方法中实现org.springframework.core.Ordered 这个接口来定义order的顺序,order 的值越小,说明越先被执行。比如代码如下:

/**
 * @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在事务介入之前就执行了!



展开阅读全文
打赏
2
9 收藏
分享
加载中
应该在指定spring声明式事务order的同时,指定其代理方式为ASPECTJ,默认为proxy。
springboot下:@EnableTransactionManagement(order = 2, mode= AdviceMode.ASPECTJ)
2019/05/28 10:20
回复
举报
试了没作用。spring和Aspect用到代理方式是不一样的。order貌似只对相同的代理方式生效
2019/05/28 10:12
回复
举报
经测试,楼主方法有效。@Order注解与实现@Ordered接口原理一样,效果一样
2019/10/09 23:47
回复
举报
这样事务会失效吗?
2017/07/28 10:44
回复
举报
纠结我几个小时的问题解决了
2017/06/08 17:22
回复
举报
必须管用的。哈哈
2016/10/19 14:45
回复
举报
79
2016/06/03 10:05
回复
举报
真管用 holy high
2016/06/01 17:43
回复
举报
管用吗?
2015/12/01 10:24
回复
举报
更多评论
打赏
9 评论
9 收藏
2
分享
返回顶部
顶部