如何配置spring中事务与aop的先后顺序

2025-04-29 22:31:32
推荐回答(1个)
回答1:

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

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

[java] view
plain copy

  • /** 

  • * @author HuifengWang 

  • * aop面向切面编程 

  • */  

  • @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
    字段,代码如下:
  • [html] view
    plain copy

  •   

  •   


  • 这样就实现了我们自己写的aop在事务介入之前就执行了!
  • 可以防止spring事务的失效。