小王被委託開發一款遊戲,程序分爲啓動頁面,登錄頁面,戰鬥頁面等。小王就採用了面向對象編程思想(OOP),把整個程序分解成下圖
這種就是傳統的自上而下的編程,或者說縱向的編程,負責啓動的模塊調用登錄模塊,登錄模塊調用戰鬥模塊。這個時候甲方說了,咱們這個遊戲要改!登錄啓動頁面要加廣告,戰鬥頁面也要加廣告。但是三個模塊已經寫好了,怎麼往裏面添加功能?這就是面向對象編程的不足,爲了彌補這個缺點,就有了面向切面編程(AOP)。
啓動,登陸,戰鬥三個模塊代碼不變,卻增長了新的功能,廣告功能至關因而橫切進來的。這就是AOP的做用。AOP的編程模式至關因而橫向的編程。AOP能夠經過代理模式去實現,就像java框架學習日誌-7(靜態代理和JDK代理)裏舉的例子同樣,收錢,打掃,炒菜的功能不改變,可是能夠經過代理模式,將「服務員,麻煩」這一功能橫插進代碼。AOP的好處和代理模式差很少:
使得真實角色處理的業務更加純粹,再也不去關注一些公共的事情。
公共業務發生拓展時變得更加集中和方便。java
關注點:增長的某一個業務,上面例子中的廣告,通常常見的是日誌,安全,緩存,事物,異常等業務。一個關注點可能會橫切多個對象。
切面:一個關注點的模塊化,好比把上面例子中的廣告都封裝成一個類,這個類就能夠叫切面。在OOP中模塊化關鍵單位是類,而在AOP中模塊化的單元則是切面。
鏈接點:在程序執行過程當中某個特定的點,一個鏈接點老是表示一個方法的執行。關注點橫切進來的位置就叫鏈接點。
通知:在切面的某個特色的鏈接點上執行的動做。編程
前置通知:在某個鏈接點以前執行的通知緩存
log.info("前置通知") public void fight(){}
後置通知:在某個鏈接點正常完成後執行的通知安全
public void fight(){} log.info("後置通知")
異常通知:在方法拋出異常退出時執行的通知
最終通知:在某個鏈接點退出時執行的通知
環繞通知:包圍一個鏈接點的通知,如方法調用,是最強大的一種通知類型。能夠在方法調用先後完成自定義的行爲。
目標對象:被一個或者多個切面所通知的對象,也叫被通知對象。 織入:把切面鏈接到其餘的應用程序類型或者對象上,並建立一個被通知對象的過程,叫織入框架