我在 spring 中使用了 AOP,没有出现任何实际问题,主要用于事务管理,这非常有用。
我的问题是这样的...到目前为止,我见过的 AOP 的唯一示例是切入您自己创建的类。是否可以切入第三方库中的类,例如数据库连接类。上下文是我希望在 Oracle 数据源执行对数据库的调用时创建一些日志并收集信息,不幸的是,该调用包含在一堆 Oracle 类文件中。当执行 SQL 时,你将如何切入这个类/方法?
最佳答案
我认为这会起作用:
- 让 Spring 负责初始化您的数据源
- 针对数据源上的 getConnection() 方法应用方面
- 根据您的建议,将返回的 Connection 包装在一个新类(“LoggingConnection”)中,该类实现 Connection 并将所有方法委托(delegate)给“真实”包装的 Connection(我相信这是装饰器模式)
- 将您需要的任何日志记录代码添加到“LoggingConnection”类
请记住,此方法创建原始数据源的代理,并为每个方法调用委托(delegate)给它。在数据库操作的上下文中,这不应该产生大量额外的开销。您需要非常小心代码正在执行的操作,以免抛出异常并阻止连接正常运行。也许使用 try/catch/finally 并将委托(delegate)给“真实”连接的调用放入您的 finally block 中。
另一种完全不同的方法是使用 AspectJ 并进行加载时编织。这样,一旦 ClassLoader 加载了该类,您就可以用新功能来装饰该类。
关于java - 第三方类的AOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/496080/