gpt4 book ai didi

java - 如何拦截自己创建的JdbcTemplate实例

转载 作者:行者123 更新时间:2023-11-30 05:27:16 25 4
gpt4 key购买 nike

我想要做的是在任何DQL(“SELECT ...”)或DML(INSERT/UPDATE/DELETE ...)之后收集数据库统计值为当前 session 执行。
目前,我利用 Spring AOP 来实现这一目标,如下所示:

@Aspect
@Component
public class StatisticalValueCollector {
@After("execution(* org.springframework.jdbc.core..*JdbcOperations.*(String, ..))")
public void collectStatisTicalValues(JoinPoint jp) {
//Collect DB statistical values
}
}

它适用于由 @Autowired 注释的 JdbcTemplateNamedParameterJdbcTemplate,但是当我自己创建它们的实例ㄋ时,它不会'不工作。

工作示例:

@Autowired
JdbcTemplate jdbcTemplate;
...
List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT ...");

未工作示例:

DriverManagerDatasource ds = new DriverManagerDatasource();
...
JdbcTemplate jdbcTemplate = new JdbcTemplate (ds);
List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT ...");

据我所知,似乎如果JdbcTemplate是由Spring创建的,它可以根据这篇文章进行代理 - AOP: Able to Intercept JDBCTemplate calls but not NamedParameterJdbcTemplate calls

因此,我的问题是“如何拦截自己创建的JdbcTemplateNamedParameterJdbcTemplate”;
任何意见和建议将不胜感激。谢谢!

更新
我还调查了不同的方法,例如 p6spydatasource-proxy ,似乎唯一的解决方案是使用纯 AspectJ 还是其他东西?

最佳答案

如果在这两种情况下您都像这样打印 JDBC 模板实例

System.out.println(jdbcTemplate + "\n  " + jdbcTemplate.getClass());

然后对于您自己创建的,您将看到

org.springframework.jdbc.core.JdbcTemplate@3c71cf3e
class org.springframework.jdbc.core.JdbcTemplate

而对于自动注入(inject)的,您将看到

org.springframework.jdbc.core.JdbcTemplate@8f39224
class org.springframework.jdbc.core.JdbcTemplate$$EnhancerBySpringCGLIB$$59a5407f

发现区别了吗?对于后者,如果存在针对它的切面,Spring 将创建一个动态代理。仅当存在动态代理时,Spring AOP 才会注册其切面建议。

我不是 Spring 用户,所以我不知道是否有另一种规范的方法来创建 JDBC 模板,以便根据需要自动创建动态代理。因此,除非您想手动创建代理(这是可能的,但不必要地复杂)或找到其他方法来执行此操作,否则只需使用依赖项注入(inject)(DI)和 Autowiring 即可。这难道不是使用 Spring 的初衷吗?创建可以注入(inject)的依赖项对于像 Spring 这样的 DI 容器来说是一种反模式。

如果您坚持采用非正统且难以测试的方法(如何为调用构造函数的局部变量注入(inject)模拟?),您始终可以使用完整的 AspectJ 作为 Spring AOP 的替代品。但我怀疑在这种情况下这样做是否值得。

关于java - 如何拦截自己创建的JdbcTemplate实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58282255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com