aspect(層面) oriented(面對) programming(程式設計),即面向切面程式設計,一種軟體開發技術、設計方案。
舉個例子,想象一下,把業務功能想象成乙個大西瓜,把這個大西瓜放到桌子上(桌子是專案),然後用刀沿水平方向,把西瓜切下,每切一下,中間放一張紙,這紙就是要做的切面,那這個切面有什麼用?比如說這樣,第一張紙指定吸水,第二張紙指定吸糖等等。
ps:據說是物件導向程式設計(object oriented programming)一種衍生范型,其實說白了就是在進行oop開發的時候,發現有些東西調整下,可以更簡單,圖方便,於是便在實踐中誕生了乙個新模型就是aop,就邏輯上而言,個人覺得兩者間沒什麼聯絡。
說白了就是,有些地方用aop,能更簡單,更方便,一勞永逸,在開發業務功能時,把一些和業務邏輯無關的東西都抽取出,給**去做。拓展點理解,就是可以降低業務邏輯各部分之間耦合度,提高程式的可重用性,同時提高了開發的效率。
舉個例子,比如專案日誌列印,考慮執行時的問題分析,在呼叫方法前要列印日誌,呼叫後要列印日誌,執行完整個程式也要列印日誌,然後拋異常還得列印日誌,大家都各自列印日誌,規範不好統一,重複**多,最重要的是,有些人還沒有記錄日誌習慣,而且你不得不承認,日誌列印實際和業務功能沒有必須依賴的聯絡,無非更多是程式設計師在分析問題時用,但它確實很重要,沒有日誌,分析問題很費力,那怎麼辦呢?重要又麻煩,而且還和業務功能無關,因此可以考慮把它們抽出來,進行單獨面的處理,即aop。
來點**實際操作下吧。
乙個簡單的除法運算。
public
class
calculator
}
打算將除法這個方法,像切西瓜一樣,切多個面。
public class logaspects
@before
("pointcut()"
)public
void
logstart()
");}
@after
("pointcut()"
)public
void
logend()
@afterreturning
("pointcut()"
)public
void
logreturn()
");}
@afterthrowing
("pointcut()"
)public
void
logexception()
");}
@around
("pointcut()"
)public
around()
throws throwable
}
a) @pointcut/定義切入點
告訴下述這些切面方法,什麼樣的業務類需要做切入,類似公共屬性,如果不用該註解,那就得讓每個方法都去定義切入點。
b) @before/前置通知
呼叫業務方法前執行該方法。
c) @after/後置通知
呼叫業務方法後執行該方法。
d) @afterreturning/返回通知
呼叫業務方法後正常返回,執行該方法。
e) @afterthrowing/異常通知
呼叫業務方法執行異常,執行該方法。
f) @around/環繞通知
定義呼叫業務方法時,最開始和最末尾需要執行的內容。
a) 正常測試
public
class
demotest
}
測試結果:
@arount:執行目標方法之前...
除法執行..
..引數列表是:
---------
@arount:執行目標方法之後...
除法結束..
....
除法正常返回..
....執行結果是:
1
b) 異常測試public
class
demotest
}
測試結果:
@arount:執行目標方法之前...
除法執行..
..引數列表是:
---------
除法結束..
....
執行異常..
....異常資訊是:
從csdn上面摘錄的一些東西,說的很具體了,但是不糾結這些吧,主要還是了解下。
就是你想要的功能,也就是上面說的 安全,事物,日誌等。你給先定義好把,然後在想用的地方用一下。
這個更好解釋了,就是spring允許你使用通知的地方,那可真就多了,基本每個方法的前,後(兩者都有也行),或丟擲異常時都可以是連線點,spring只支援方法連線點.其他如aspectj還可以讓你在構造器或屬性注入時都行,不過那不是咱關注的,只要記住,和方法有關的前前後後(丟擲異常),都是連線點。
上面說的連線點的基礎上,來定義切入點,你的乙個類裡,有15個方法,那就有幾十個連線點了對把,但是你並不想在所有方法附近都使用通知(使用叫織入,以後再說),你只想讓其中的幾個,在呼叫這幾個方法之前,之後或者丟擲異常時乾點什麼,那麼就用切點來定義這幾個方法,讓切點來篩選連線點,選中那幾個你想要的方法。
切面是通知和切入點的結合。現在發現了吧,沒連線點什麼事情,連線點就是為了讓你好理解切點,搞出來的,明白這個概念就行了。通知說明了幹什麼和什麼時候幹(什麼時候通過方法名中的before,after,around等就能知道),而切入點說明了在哪幹(指定到底是哪個方法),這就是乙個完整的切面定義。
允許我們向現有的類新增新方法屬性。這不就是把切面(也就是新方法屬性:通知定義的)用到目標類中嗎。
引入中所提到的目標類,也就是要被通知的物件,也就是真正的業務邏輯,他可以在毫不知情的情況下,被咱們織入切面。而自己專注於業務本身的邏輯。
怎麼實現整套aop機制的,都是通過**,這個一會給細說。
把切面應用到目標物件來建立新的**物件的過程。有3種方式,spring採用的是執行時,為什麼是執行時,後面解釋。
框架與元件的淺見
看了眾多牛人,對於眾多的開源專案瞭如指掌,發現自己太無知了,要努力學習。我想我並不需要象牛人們一樣面面俱到,我只需要尋找到一條敏捷開發的道路就可以了,一條就夠了。航海時千萬不要帶兩塊表。我相信pojo annotation將是優秀框架的基礎。fullstack框架,要慎用。由pojo生成的一切 都不...
DIV CSS與Table優劣的淺見
div與table本身並不存在什麼優缺點,所謂web標準只是推薦的是正確的使用標籤,好比說 div用於布局,而table則本來就是轉二維資料的。讓table做該做的事,並不是說頁面裡不出現table就是多麼多麼牛。用div進行排版的優勢就是我不說,大家應該都比較清楚。div是標準,是大勢所趨,但並不...
Spring AOP配置與應用
兩種方式 a 使用annotation b 使用xml annotation a 加上對應的xsd檔案spring aop.xsd b beans.xml c 此時就可以解析對應的annotation了 d 建立我們的攔截類 e 用 aspect註解這個類 f 建立處理方法 g 用 before來註...