zoukankan      html  css  js  c++  java
  • Spring AOP 通过order来指定顺序

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt398

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    @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 字段,代码如下:    

    <!-- 注解方式配置事物 -->

    1
    <tx:annotation-driven transaction-manager="transactionManager" order="2"/>

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

  • 相关阅读:
    源码篇:Python 实战案例----银行系统
    源码分享篇:使用Python进行QQ批量登录
    python制作电脑定时关机办公神器,另含其它两种方式,无需编程!
    Newtonsoft.Json 去掉
    C#Listview添加数据,选中最后一行,滚屏
    C# 6.0语法糖
    XmlHelper
    AppSettings操作类
    JsonHelper
    JS加载获取父窗体传递的参数
  • 原文地址:https://www.cnblogs.com/grefr/p/6087995.html
Copyright © 2011-2022 走看看