我试图使用面向方面的编程在spring JdbcTemplate和SimpleJdbcTemplate中记录执行的SQL查询。我已经从此tutorial复制粘贴了代码

切入点定义为

@Before(
    "execution(* org.springframework.jdbc.core.JdbcOperations.*(String, ..))"
)


非常适合拦截JdbcTemplate查询。但是当我将切入点更改为

@Before(
    "execution(* org.springframework.jdbc.core.JdbcOperations.*(String, ..)) throws *Exception || " +
    "execution(* org.springframework.jdbc.core.simple.SimpleJdbcOperations.*(String, ..)) throws *Exception"
)


要么

@Before(
    "execution(* org.springframework.jdbc.core.JdbcOperations.*(String, ..)) || " +
    "execution(* org.springframework.jdbc.core.simple.SimpleJdbcOperations.*(String, ..))"
)


那么只有JdbcTemplate查询会在没有SimpleJdbcTemplate的情况下被拦截
查询。

有什么提示如何在保留来自JdbcTemplate的日志查询的同时,通过AOP拦截来自SimpleJdbcTemplate的查询?

最佳答案

作为AspectJ用户,我可以说您的切入点看起来不错。作为非Spring用户,我只能推测


也许您的代码根本不使用SimpleJdbcOperations
也许Spring本身并没有您所期望的那样,可能是因为该接口实际上是deprecated since Spring 3.1


顺便说一句,只是为了好玩,我对您有一个想法,如果您不介意同时捕获NamedParameterJdbcOperations的话,如何实际上可以稍微缩短切入点:

@Before("execution(* org.springframework.jdbc.core..*JdbcOperations.*(String, ..))")

10-06 03:24