Spring中事务与aop的先后顺序问题(注解形式)
Spring中的事务是通过aop来实现的,当我们⾃⼰写aop拦截的时候,会遇到跟spring的事务aop执⾏的先后顺序问题,⽐如说动态切换数据源的问题,如果事务在前,数据源切换在后,会导致数据源切换失效,所以就⽤到了Order(排序)这个关键字.
我们可以通过在@AspectJ的⽅法中实现Ordered 这个接⼝来定义order的顺序,order 的值越⼩,说明越先被执⾏。⽐如代码如下:
/**
* @author HuifengWang
* aop⾯向切⾯编程
*
*/
@Component
@Aspect
public class AspectJ4DataBase implements Ordered{
//拦截所有的service操作
spring aop应用场景@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在事务介⼊之前就执⾏了!
可以防⽌spring事务的失效。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。