2010-11-30 209 views
30

首先讓我注意一點,我使用AspectJ和我喜歡它,但是我還能用它做些什麼。AspectJ的優點是什麼?

我知道AspectJ可以被用於記錄。在某些情況下,它用於事務控制 - 主要與註釋一起實施。 AspectJ也可以用來增強(代碼生成)方法的類,就像Spring Roo一樣。但我相信AspectJ和AOP一般來說,可以用於多於:日誌記錄,事務控制和模擬部分類。

那麼AspectJ和AOP有哪些其他有用的用例呢?

+2

您應該閱讀Ramnivas Laddad的AspectJ in Action http://www.manning.com/laddad2 TOC將爲您提供理念:http://www.manning.com/laddad2/excerpt_contents.html – 2010-11-30 12:40:04

+2

@George Stocker:這個問題有14個upvotes,0個downvotes,3個答案,總共有21個upvotes,你在4年後擱置 - 真的?問題是這個問題有很好的答案,所以它沒有真正存在這個「太寬泛」的問題。 – Ralph 2014-08-10 12:09:46

回答

26
  • 權限檢查
  • 中斷操作時間過長
  • 運行動作單獨的線程,甚至在不同的進程或事件的背景下其他機器
  • 監控
  • 前準備的任何數據/環境上呼叫後處理結果
  • 開啓/關閉資源

編輯

雖然我給了這個答案很多年過去了,但我決定添加以下內容來使答案更加完整。

  • 安全檢查。
  • 修復了您無法更改的API錯誤或行爲。例如在某些情況下返回false的布爾方法,但應返回true。您可以使用AspectJ修復此問題。
16

Wikipedia entry給你幾個例子(但不是那麼多)。通常情況下,面向方面的編程只能用於實現簡單的行爲,這些行爲不屬於某個類的核心關注部分,並且對於不同的類是共同的。只要你開始在你的方面投入太多的邏輯,代碼變得真的不可讀。

您建議的方面(日誌記錄,交易等)是最常用的方面。我也會增加安全性。

2

可以使用AspectJ來執行一些(設計)規則。


進樣嘲笑在原本將通過使用新創建新實例類。 假設你有這樣的代碼:

public void sendInvitationEmail(String address) { 
    InvitationEmail email = new InvitationEmail(); 
    email.sendTo(address).send(); 
} 

而且需要通過模擬來代替email。然後你可以使用一個方面(@Pointcut("call(InvitationEmail.new(..))") )來「注入」一個模擬。 - @See Blog JMock and AspectJ Daniel Roop以及Spring Roo的@MockStaticEntityMethods(Mock Static Methods using Spring Aspect