Java 第三方类的AOP

Java 第三方类的AOP,java,spring,aop,spring-aop,Java,Spring,Aop,Spring Aop,我在spring中使用了AOP,没有任何实际问题,主要用于事务管理,这是它的一大魅力 我的问题是。。。到目前为止,我所看到的关于AOP的唯一例子是对您自己创建的类进行切入点。是否可以在第三方库中切入类,例如数据库连接类。上下文是,我希望在oracle数据源执行对数据库的调用时创建一些日志并收集信息,不幸的是,该调用包含在oracle类文件堆栈中。在执行SQL时,您将如何切入此类/方法?我认为这将起作用: 让Spring负责初始化您的数据源 对数据源上的getConnection()方法应用方面

我在spring中使用了AOP,没有任何实际问题,主要用于事务管理,这是它的一大魅力


我的问题是。。。到目前为止,我所看到的关于AOP的唯一例子是对您自己创建的类进行切入点。是否可以在第三方库中切入类,例如数据库连接类。上下文是,我希望在oracle数据源执行对数据库的调用时创建一些日志并收集信息,不幸的是,该调用包含在oracle类文件堆栈中。在执行SQL时,您将如何切入此类/方法?

我认为这将起作用:

  • 让Spring负责初始化您的数据源
  • 对数据源上的getConnection()方法应用方面
  • 在您的建议中,将返回的连接包装在一个新类(“LoggingConnection”)中,该类实现连接并将所有方法委托给“真正的”包装连接(我相信这是装饰器模式)
  • 向“LoggingConnection”类添加所需的任何日志代码
  • 请记住,这种方法创建原始数据源的代理,并为每个方法调用委托给它。在数据库操作的上下文中,这不应该产生很多额外的开销。您需要非常小心您的代码在做什么,以免它抛出异常并阻止连接正常运行。也许可以使用try/catch/finally并将委托给finally块中“真正”连接的调用放入finally块

    另一种完全不同的方法是使用AspectJ并进行加载时编织。这样,在类加载器加载类后,您就可以用新功能装饰该类