首页 > 编程语言 > 详细

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

时间:2015-11-03 23:13:52      阅读:478      评论:0      收藏:0      [点我收藏+]

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

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

原文:http://my.oschina.net/u/2350108/blog/525495

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!