2013-05-31 46 views
2

你好我已經開始學習spring MVC了。完成編寫代碼足夠好,但我仍然覺得AOP是一個難以理解的概念,已經檢查了這個post。並通過了Spring文檔。我仍然覺得這很容易讓人困惑,因爲解釋並不是通俗的說法,也很難理解。 AOP有一個常見的日誌記錄示例。仍然不明白它的靈魂。你能否用外行人的語言來解釋帶有和不帶有這種帶有示例實現的概念是什麼?歡迎提供良好教程的鏈接。請不要發表冗長的論點,以免這篇文章變得毫無用處。這僅用於解釋。現在可以忽略使用它的好處/缺點。用spring-proxy解釋Spring中面向方面編程

回答

3

我認爲就定義而言,Aspecting最簡單的方法是使用單個表達式定義代理(或代理)的聲明性方法。

做作情況:

說你要計算多少次「吸氣」方法被調用,在您的應用程序的任何 getter方法。那麼,你會發現每個'getter'方法,並增加一些靜態計數器。這可能是你可以接受的,但是你也需要確保你爲從這一點開始添加到你的應用程序的每個'getter'方法做同樣的事情。

考慮一個方面:

的方面是由2分主要的事情。正在執行的代碼即代理,以及聲明式表達式,用於說明代理代碼的應用位置。

代理可以寫入一個'getter',它可以在方法調用之前或之後自動增加計數器。這個代理的問題在於它仍然需要應用於每個'getter'方法。這是一個方面的亮點。你可以寫一個快速定義(通過你最喜歡的aspecting庫表達式語言),說'爲所有'getter'方法做這個代理。

示例使用SpringAOP:

@Aspect 
public class MyAspect 
{ 
    private static int counter = 0; 

    @Before("execution(* get*())") 
    public void incrementCounterProxy() 
    { 
     counter++; 
    } 
} 

舉例說明:

假設你擁有一切設置你的Spring容器正確地拿起方面,這應該履行我們的做作的目標。

  1. @Aspect標誌着我們班一類是含有方面的候選人。
  2. @Before標誌着我們的代理類型。該方法中的代碼將是一個僅在目標方法調用之前執行任務的代理。
  3. execution(* get*())是我們的聲明式表達式,它將此代理應用於以'get'開頭並且沒有參數的方法的所有執行。
+0

好簡單的說明。明白髮生了什麼事。但是Aspect和代理現在合併了,你可以請兩個人分開一點。無論如何,我將你的解釋標記爲答案。按照我的觀點,方面是具有要執行的通用代碼的代碼片段。而代理是設計..我正確? –

+2

該方面由2個主要事情組成。正在執行的代碼即代理,以及聲明式表達式,用於說明代理代碼的應用位置。 –

+0

完美無缺。 –