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

  • 相关阅读:
    Storm的并行度、Grouping策略以及消息可靠处理机制简介
    storm入门原理介绍
    Kafka学习笔记-Java简单操作
    批量复制word文档,并生成以日期为后缀名的批量文档攻略,批量生成word文档
    数组
    分支结构,循环结构学习整理
    java中的运算符
    Java中的变量和基本数据类型知识
    Java开发环境描述
    使用Map,统计字符串中每个字符出现的次数
  • 原文地址:https://www.cnblogs.com/zjrodger/p/5635933.html
Copyright © 2011-2022 走看看