使用Spring AOP记录好主意吗?

时间:2010-01-15 11:22:22

标签: java spring logging aop spring-aop

我现在正在阅读Spring,其中一个用于使用AOP的示例是记录方法调用的开始和结束。

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

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

我所工作的公司的编码策略需要大量的日志记录,我希望减少我必须编写的日志代码量并提高代码的可读性。

我是在咆哮错误的树吗?

3 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:14)

请阅读this blog-post,了解您的效果问题。

考虑AOP的方法是首先提供所提供的功能优势。如果您需要自动记录并且AOP适合它 - 那就去吧。

尽管如此,如果需要进行细粒度测井,负载时间编织当然是首选。

答案 2 :(得分:3)

我的做法与this blog post中描述的方式类似。这是我发现的最好的,它也有sample,很好地显示了使用和不使用AOP之间的区别。

Imho它是不值得的,除非你做的更好的事情然后记录,比如持久性的错误管理。如果您有一个良好的异常层次结构(域,系统)并正确设置日志记录边界,则不会减少很多日志记录代码。