使用Spring AOP记录好主意吗?

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

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

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

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

我吠叫错了树吗?

阅读此博客文章,了解您的性能问题。

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

也就是说,如果需要细粒度测井,则负载时间编织当然是首选。

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

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

我按照本博文中描述的方式进行了类似的操作 。 这是我发现的最好的,它也有一个样本 ,很好地显示了使用和不使用AOP之间的区别。

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