Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用AspectJ监视数据库访问方法_Java_Sql_Monitoring_Aop_Aspectj - Fatal编程技术网

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

Java 使用AspectJ监视数据库访问方法,java,sql,monitoring,aop,aspectj,Java,Sql,Monitoring,Aop,Aspectj,我想使用AspectJ来监视数据库语句 当我将切入点定义为 @Pointcutexecution*java.sql.*语句.execute*。。 它不起作用。但是当我把切入点定义为 @切入点执行**。。 它可以监视所有方法 如何定义切入点来只监视数据库访问方法?您所说的不是真的,因为使用第二个切入点,您可以捕获大量的方法执行,但在JDK中什么都没有。如果您想一想,就会明白为什么:AspectJ插入字节码,但只插入您自己的类或库的字节码,而不是JDK字节码,因为您没有将方面编织到JDK中。因此,除

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

当我将切入点定义为

@Pointcutexecution*java.sql.*语句.execute*。。 它不起作用。但是当我把切入点定义为

@切入点执行**。。 它可以监视所有方法


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

您所说的不是真的,因为使用第二个切入点,您可以捕获大量的方法执行,但在JDK中什么都没有。如果您想一想,就会明白为什么:AspectJ插入字节码,但只插入您自己的类或库的字节码,而不是JDK字节码,因为您没有将方面编织到JDK中。因此,除非在rt.jar中插入类文件,否则无法捕获JDK中的任何执行连接点

现在你如何解决你的问题?首先,您需要理解执行和调用切入点之间的根本区别:前者被编织到被调用方中,即直接编织到目标方法中。后者被编织成调用者,即被调用目标方法的所有地方

你想试试吗

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


我知道这是一个简单问题的复杂答案,但在使用AspectJ之前,您确实需要理解它,否则您可能无法完全理解我试图解释的内容。AspectJ学习和实验都很有趣,慢慢来享受吧。如果你只是复制和粘贴代码片段,那么你就是一个拥有强大工具的傻瓜-

您所说的不是真的,因为使用第二个切入点,您可以捕获大量的方法执行,但在JDK中什么都没有。如果您想一想,就会明白为什么:AspectJ插入字节码,但只插入您自己的类或库的字节码,而不是JDK字节码,因为您没有将方面编织到JDK中。因此,除非在rt.jar中插入类文件,否则无法捕获JDK中的任何执行连接点

现在你如何解决你的问题?首先,您需要理解执行和调用切入点之间的根本区别:前者被编织到被调用方中,即直接编织到目标方法中。后者被编织成调用者,即被调用目标方法的所有地方

你想试试吗

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


我知道这是一个简单问题的复杂答案,但在使用AspectJ之前,您确实需要理解它,否则您可能无法完全理解我试图解释的内容。AspectJ学习和实验都很有趣,慢慢来享受吧。如果你只是复制和粘贴代码片段,那么你就是一个拥有强大工具的傻瓜-

第二个切入点可能会起作用,因为它还匹配JDBC驱动程序的语句实现类,而JDBC驱动程序不是JDK的一部分,因此可以在链接时由AspectJ编织。第二个切入点可能会起作用,因为它还匹配JDBC驱动程序的语句实现类,这不是JDK的一部分,因此可以在链接时由AspectJ编织。