33

我目前正在阅读 Spring,用于使用 AOP 的示例之一是记录方法调用的开始和结束。

我还读到使用 AOP 会影响性能。

对于这种类型的日志记录,使用 Spring AOP 是一个好主意吗?我的理解是,Spring 使用动态 AOP 对这种类型的 AOP 使用静态 AOP(如 AspectJ)会更好。

目前,我工作的公司的编码政策需要大量的日志记录,我想减少我必须编写的日志记录代码的数量并提高我的代码的可读性。

我在吠叫错误的树吗?

4

3 回答 3

41

我使用 Spring AOP 来实现日志记录,所以我分享我的观察:

  • 性能影响不够,小于日志本身的影响
  • 在 Spring 配置中配置了方面,如有必要,您可以完全禁用日志记录代码
  • 随着堆栈跟踪变得相当长,调试变得更加成问题
  • 这样的决定足以影响设计。不仅你得到一堆接口和方面类,而且你的生产类必须非常“瘦”。不要忘记,您无法拦截对非公共方法的调用。自调用(甚至是公共方法)也无法被拦截(因为您使用裸this句柄而不是 AOP 包装的句柄),因此无法记录。因此,所有日志记录只能发生在接口边界上。(这涉及到使用基于代理的方面编织,有一个使用 cglib 进行运行时子类化的选项,但我没有使用它)
  • 编写切入点可能非常棘手。IntelliJ Idea 极大地帮助确定切入点建议哪些方法。
  • 总的来说,我喜欢这种方法并认为它值得使用,但它看起来比我预期的要复杂得多
于 2010-01-15T11:52:55.277 回答
17

阅读这篇关于您的性能问题的博文。

考虑 AOP 的方法是将提供的功能优势放在首位。如果自动日志记录是您的要求并且 AOP 适合它 - 去吧。

也就是说,如果需要细粒度的日志记录,加载时编织当然是首选。

于 2010-01-15T11:45:06.723 回答
3

我这样做的方式与这篇博文中描述的方式类似。这是我找到的最好的,它还有一个示例,很好地显示了使用和不使用 AOP 之间的区别。

恕我直言,这是不值得的,除非您正在做一些比记录更有趣的事情,例如持久性的错误管理。如果您有良好的异常层次结构(域、系统)并正确设置日志边界,您将不会减少太多日志代码。

于 2011-07-20T12:39:13.600 回答