zoukankan      html  css  js  c++  java
  • 【转】Spring中事务与aop的先后顺序问题

    【原文链接】

    http://my.oschina.net/HuifengWang/blog/304188

    【正文】

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

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

     1 /**
     2  * @author HuifengWang
     3  * aop面向切面编程
     4  *
     5  */
     6 @Component
     7 @Aspect
     8 public class AspectJ4DataBase implements Ordered{
     9     
    10     //拦截所有的service操作
    11     @Pointcut("execution( * com.hc.shop.*.service.*.*(..))")
    12     public void readMethod() {
    13     }// 匹配所有的读取操作
    14     
    15     @Before("readMethod()")
    16     public void onlyReadPre(){
    17         DataSourceContextHolder.setDataSourceType(DataSourceType.MYSQL);
    18         System.out.println("数据库切换MYSQL");
    19     }
    20     @After("readMethod()")
    21     public void onlyReadPast(){
    22         DataSourceContextHolder.setDataSourceType(DataSourceType.ORACLE);
    23         System.out.println("数据库切换回ORACLE");
    24     }
    25 
    26     @Override
    27     public int getOrder() {
    28         // TODO Auto-generated method stub
    29         return 1;
    30     }
    31 }

    步骤02:

    在事务配置的地方也配置order 字段,代码如下

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

    这样就实现了我们自己写的aop在事务介入之前就执行了!

  • 相关阅读:
    组策略导入导出secedit
    ipad常见错误
    ipad系统路径
    内核操作注册表例子
    WoW64子系统
    win2003 shutdown命令
    regedit 导入注册表
    windbg for CLR
    WM_POWERBROADCAST
    OpenSSL命令
  • 原文地址:https://www.cnblogs.com/zjrodger/p/5635933.html
Copyright © 2011-2022 走看看