使用mybatis.spring扫描带有bean的Spring AOP。* .MapperScan

问题描述 投票:1回答:1

我正在研究一个组件,以使用Spring AOP实现审计。我可以将它用于大多数服务的方法。但发现用Mybatis的地图选手AOP切点不起作用。

基本上,Spring AOP仅适用于Spring管理的bean。但是这些映射器bean已经使用mybatis.spring.*.MapperScan进行扫描,并且可以在其他Spring组件中自动连接。

为什么不能扫描这些bean用于Spring AOP?任何的想法?

我可以使用AspectJ但是很想知道mybatis.spring.*.MapperScan是如何工作的。

例如 -

我有这些配置一个用于Mybatis映射器扫描,另一个配置用于特定于应用程序的配置。

@Configuration
@MapperScan("com.test.mapper")
public class ProviderConfiguration {

   @Bean
   public SqlSessionFactory sqlSessionFactory(final DataSource src) throws Exception {
      ...
   }
}

@Configuration
@EnableAspectJAutoProxy
public class MainConfiguration {

}

我的Dao逻辑我称之为mapper方法 -

@Component
public class TestDao {

   //injecting mybatis mapper here
   @Inject
   private SaveTableData saveTableData;

   public TableData save(TableData tableData) {
       saveTableData.updateTableData(tableData);
   }
}

我已经注册了我的切入点如下

@Component
@Aspect
public class TestAdvices {
  @Pointcut("execution(* com.test.mapper.SaveTableData.updateTableData(*))") 
  public void commonSaveTableData(TableData tableData) {
  }

  @Pointcut("execution(* com.test.service.CreateTableData.createTableData(*))") 
  public void commonCreateTableData(TableData tableData) {
  }  

  //advices
  @After("commonSaveTableData(tableData)")
  public void addHistoryWhenSaveTableData(TableData tableData) throws Throwable {
      //do stuff    
  }

  //advices
  @After("commonCreateTableData(tableData)")
  public void addHistoryWhenCreateTableData(TableData tableData) throws Throwable {
      //do stuff    
  }
}

问题是commonCreateTableData,服务方法按预期工作。但是在Mybatis映射器方法上的commonSaveTableData不会被调用。

问题是,如果我可以在任何Spring bean中自动装配这些Mapper,为什么Spring AOP拦截方法不能使用这些切入点调用?

spring aop mybatis spring-aop spring-mybatis
1个回答
0
投票

我认为你的切入点表达不正确,试试这个

@Component
@Aspect
public class TestAdvices {
  @Pointcut("execution(* com.test.mapper.SaveTableData.updateTableData(*)) && args(tableData)", argNames="tableData") 
  public void commonSaveTableData(TableData tableData) {
  }



//advices
  @After("commonSaveTableData(tableData)", argNames="tableData")
  public void addHistoryWhenSaveTableData(TableData tableData) throws Throwable {
      //do stuff    
  }
//...
}
© www.soinside.com 2019 - 2024. All rights reserved.