Spring AOP со сканированием bean-компонента с использованием mybatis.spring. *. MapperScan

Я работаю над одним компонентом для достижения аудита с использованием Spring AOP. Я мог бы использовать его для большинства методов службы. Но обнаружил, что с картографами Mybatis точечные разрезы АОП не работают.

По сути, Spring AOP работает только с bean-компонентами, управляемыми Spring. Но эти компоненты отображения были просканированы с помощью mybatis.spring.*.MapperScan и могут быть автоматически подключены к другим компонентам Spring.

Почему эти бины нельзя сканировать на наличие Spring AOP? Любая идея?

Я могу использовать AspectJ, но очень хотел узнать, как работает mybatis.spring.*.MapperScan.

Например -

У меня есть эти конфигурации: одна для сканирования Mybatis mapper, а другая - для конфигураций конкретных приложений.

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

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

@Configuration
@EnableAspectJAutoProxy
public class MainConfiguration {

}

Моя логика Дао, где я вызываю метод сопоставления -

@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 находится в сервисном режиме и работает должным образом. Но commonSaveTableData, который находится в методе Mybatis mapper, не вызывается.

Вопрос в том, могу ли я автоматически подключать эти Mappers к любому компоненту Spring, почему не удается перехватить вызов метода Spring AOP с использованием этих pointcut?

Я обновил вопрос примером.

Amit Naik 03.08.2018 08:20

Можете ли вы добавить сервисный код - или куда бы вы ни обращались к картографу?

Reg 03.08.2018 09:27

это довольно простой вызов из моего класса Дао. я обновил его.

Amit Naik 03.08.2018 09:38

Пока все в комплектации выглядит хорошо. Можете ли вы также показать советы, связанные с определенными точками?

Roman Konoval 09.08.2018 09:26

Добавлен образец реализации для советов, но он даже не вызывается с помощью методов сопоставления.

Amit Naik 10.08.2018 06:41

я думаю, вам следует загрузить весь код на github, так что я могу вам очень помочь

clevertension 14.08.2018 05:45

это опечатка? ЯщикTableData -> СоздаватьTableData

clevertension 20.08.2018 09:57

да. исправил.

Amit Naik 20.08.2018 10:16
1
8
497
2

Ответы 2

Я думаю, что ваше выражение pointcut неверно, попробуйте это

@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    
  }
//...
}

попробовал это для методов Mapper. не сработало. я могу обновить свой код.

Amit Naik 13.09.2018 06:44

как вы можете судить, что метод after не выполняется

clevertension 13.09.2018 07:28

Я проверил это путем отладки. это не работает.

Amit Naik 01.10.2018 12:50

Причина, по которой вы не можете разрезать mapper таким образом, заключается в том, что когда mapper сканируется mybatis, определение bean-компонента было изменено таким образом, что его интерфейс по-прежнему является интерфейсом mapper, но его класс был изменен на MapperFactoryBean

Другие вопросы по теме