我正在研究一个组件,以使用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拦截方法不能使用这些切入点调用?
我认为你的切入点表达不正确,试试这个
@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
}
//...
}