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

  • 相关阅读:
    WebView.自动登录
    Android.对话框(AlertDialog/Toast/Snackbar)
    ubuntu解压rar
    sqlserver2005 存储过程模板及调用
    win7 32位下装oracle 10g报未知错误
    oracle下常用查询更新命令(身份证号判断男女,更新语句多表查询)
    如何建立一个android工程
    ubuntu14.04 配置android及sdk等相关操作
    mysql 常用简单的几个命令
    linux的tar简单使用
  • 原文地址:https://www.cnblogs.com/grefr/p/6087995.html
Copyright © 2011-2022 走看看