使用AspectJ监视数据库访问方法

tri*_*mph 1 java sql aop monitoring aspectj

我想使用AspectJ来监视数据库语句.

当我将切入点定义为

@Pointcut("execution(* java.sql.*Statement.execute*(..))")
Run Code Online (Sandbox Code Playgroud)

这是行不通的.但是当我将切入点定义为

@Pointcut("execution(* *.*(..))")
Run Code Online (Sandbox Code Playgroud)

它可以监控所有方法.

如何定义切入点以仅监视数据库访问方法?

kri*_*aex 7

你说的不是真的,因为使用第二个切入点你可以捕获大量的方法执行但JDK中没有任何内容.如果你想了一会儿就明白了原因:AspectJ设备字节代码,但只有你自己的类或库的字节代码,而不是JDK字节代码,因为你没有将你的方面编织到JDK中.因此,您无法捕获execution()JDK中的任何连接点(除非您在内部检测类文件rt.jar).

现在你如何解决你的问题?首先,您需要了解切入点execution()call()切入点之间的根本区别:前者被编织到被调用者中,即直接进入目标方法.后者被编织到呼叫者中,即进入调用目标方法的所有地方.

所以你想试试

@Pointcut("call(* java.sql.*Statement.execute*(..))")
Run Code Online (Sandbox Code Playgroud)

但有一点需要注意:如果您自己的代码(即使用AspectJ编译的代码)直接调用语句,那么您就可以了.如果你有兴趣捕获第三方库的调用,你或者需要编织那些通过二进制编织(生成一个新的库,编织类文件替换原始文件)或者通过加载时编织(检测字节)在运行时加载代码).两者都是可能的.但是如何做到这一点超出了本文的范围,请阅读AspectJ文档以获取相关说明.最后但并非最不重要的是,如果JDK代码在内部调用这些方法,那么除了编织JDK(rt.jar或SQL代码所在的任何地方)之外,您将无法通过任何其他方式捕获调用,如上所述.

我知道这是一个简单问题的复杂答案,但在使用之前你确实需要理解AspectJ,否则你可能无法完全理解我想要解释的内容.AspectJ很有趣,可以学习和试验,花时间享受它.如果您只是复制并粘贴代码片段,那么您只需使用(非常强大的)工具即可.:-)