博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring中事务与aop的先后顺序问题
阅读量:6239 次
发布时间:2019-06-22

本文共 1026 字,大约阅读时间需要 3 分钟。

hot3.png

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

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

                        

                            

/**

 * HuifengWang

 * aop面向切面编程

 *

 */

@Component

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

转载于:https://my.oschina.net/tinglanrmb32/blog/607684

你可能感兴趣的文章
[Zephir官方文档翻译之四] 安装Zephir
查看>>
每天学一点Scala之内部类
查看>>
BWidget部件
查看>>
JavaScript强化教程 - 六步实现贪食蛇
查看>>
在oracle中恢复一个表的数据到某个时点
查看>>
我的友情链接
查看>>
maven环境快速搭建
查看>>
我的友情链接
查看>>
半导体产业的根基:晶圆是什么
查看>>
PHP页面刷新
查看>>
数据库之变迁
查看>>
DICOM协议中有关打印的内容
查看>>
lsmod
查看>>
server 2003 IIS无法访问asp页面,但是可以访问html静态页面
查看>>
totem成为万能播放器
查看>>
常用CSS记录
查看>>
我的友情链接
查看>>
DNS介绍和原理
查看>>
使用JIRA搭建企业问题跟踪系统3
查看>>
如何定位消耗CPU最多的线程
查看>>