Я работаю над одним компонентом для достижения аудита с использованием 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?
Можете ли вы добавить сервисный код - или куда бы вы ни обращались к картографу?
это довольно простой вызов из моего класса Дао. я обновил его.
Пока все в комплектации выглядит хорошо. Можете ли вы также показать советы, связанные с определенными точками?
Добавлен образец реализации для советов, но он даже не вызывается с помощью методов сопоставления.
я думаю, вам следует загрузить весь код на github, так что я могу вам очень помочь
это опечатка? ЯщикTableData -> СоздаватьTableData
да. исправил.
Я думаю, что ваше выражение 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. не сработало. я могу обновить свой код.
как вы можете судить, что метод after не выполняется
Я проверил это путем отладки. это не работает.
Причина, по которой вы не можете разрезать mapper таким образом, заключается в том, что когда mapper сканируется mybatis, определение bean-компонента было изменено таким образом, что его интерфейс по-прежнему является интерфейсом mapper, но его класс был изменен на MapperFactoryBean
Я обновил вопрос примером.