2010-01-15 54 views
28

我正在讀Spring,目前使用AOP的例子之一是記錄方法調用的開始和結束。使用Spring AOP記錄一個好主意?

我也讀過使用AOP會影響性能。

正在使用Spring AOP這種類型的日誌記錄的好主意?我的理解是,Spring使用動態AOP對於這種類型的AOP使用靜態AOP(如AspectJ)會更好。

我的工作所在公司的編碼策略確實需要一個荒謬的日誌記錄量,我想減少日誌代碼的數量,以便提高我的代碼的可讀性。

我吠叫錯了樹嗎?

回答

13

閱讀this blog-post關於您的性能問題。

想到AOP的方法是將提供的功能優勢放在首位。如果自動日誌記錄是您的要求並且AOP適合它 - 那就去做吧。

也就是說,如果需要細粒度的記錄,加載時織造當然是首選。

32

我使用過Spring AOP實現的日誌記錄,所以我分享我的意見:

  • 對性能的影響是不夠的,它小於採伐本身的影響
  • 具有Spring配置配置方面,你能在必要時完全禁用日誌代碼
  • 隨着堆棧跟蹤變得更長,調試變得更加成問題
  • 此類決策充分影響設計。這不僅僅是你得到一堆接口和方面類,但你的生產類必須非常「瘦」。不要忘記,您無法攔截對非公開方法的調用。自我調用(即使是公共方法)也不能被攔截(因爲你使用裸體this而不是AOP包裝的句柄),因此無法記錄。所以所有的日誌記錄只能發生在界面邊界上。 (這涉及使用基於代理的方面編織,有一個與cglib運行時子類化的選項,但我沒有使用它)
  • 寫入切入點可能非常棘手。 IntelliJ Idea可以幫助您很好地確定哪些方法需要切入點。
  • 一般來說,我喜歡這種做法,認爲這是值得使用,但似乎遠比我預想的
3

我做到了同樣的this blog post描述的方式更加複雜。這是我找到的最好的,它也有一個sample,很好地顯示了使用和不使用AOP之間的區別。

Imho它是不值得的,除非你正在做一些更奇特的事情然後登錄,就像持久性的錯誤管理一樣。如果你有一個很好的異常層次結構(域,系統)並正確設置了日誌邊界,那麼你不會減少很多日誌代碼。

+0

鏈接指向博客網站,而不是相關主題的實際博客 – 2014-10-16 20:58:16