用于派生查询的 Spring jpa 拦截器



我想在执行之前拦截 spring jpa 派生的查询。 我尝试使用EmptyInterceptor和StatementInspector,但它们正在拦截用@query注释的查询。

我推荐net.ttddyy:datasource-proxy:

implementation 'net.ttddyy:datasource-proxy:1.5.1'

以下是PostProcessor和Interceptor:

@Component
@Slf4j
public class DatasourceProxyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
if (bean instanceof DataSource && !(bean instanceof ProxyDataSource)) {
log.info("DataSource bean has been found: " + bean);
final ProxyFactory factory = new ProxyFactory(bean);
factory.setProxyTargetClass(true);
factory.addAdvice(new ProxyDataSourceInterceptor((DataSource) bean));
return factory.getProxy();
}
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean;
}
private static class ProxyDataSourceInterceptor implements MethodInterceptor {
private final DataSource dataSource;
public ProxyDataSourceInterceptor(final DataSource dataSource) {
this.dataSource = ProxyDataSourceBuilder.create(dataSource)
.name("MyServiceDS")
.logQueryBySlf4j(SLF4JLogLevel.DEBUG)
.multiline()
.build();
}
@Override
public Object invoke(final MethodInvocation invocation) throws Throwable {
final Method proxyMethod = ReflectionUtils.findMethod(this.dataSource.getClass(),
invocation.getMethod().getName());
if (proxyMethod != null) {
return proxyMethod.invoke(this.dataSource, invocation.getArguments());
}
return invocation.proceed();
}
}
}

欲了解更多信息: https://github.com/ttddyy/datasource-proxy