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