1

我在 spring 中使用了 AOP,没有遇到任何实际问题,主要用于事务管理,这很有吸引力。

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

4

1 回答 1

2

我认为这会起作用:

  1. 让 Spring 负责初始化你的 DataSource
  2. 对 DataSource 上的 getConnection() 方法应用方面
  3. 在您的建议中,将返回的 Connection 包装在一个新类(“LoggingConnection”)中,该类实现 Connection 并将所有方法委托给“真实”包装的 Connection(我相信这是装饰器模式)
  4. 将您需要的任何日志记录代码添加到“LoggingConnection”类

请记住,这种方法会创建原始 DataSource 的代理,并为每个方法调用委托给它。在数据库操作的上下文中,这不应该产生很多额外的开销。您将需要非常小心您的代码正在做什么,以免它引发异常并阻止连接正常运行。也许使用 try/catch/finally 并将委托给“真实”连接的调用放在 finally 块中。

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

于 2009-01-30T16:54:41.407 回答