什么是AOP?
與OOP對比帝洪,AOP是處理一些橫切行問題。這些橫切性問題不會影響到主邏輯的實現(xiàn)脚猾,但是會散落到代碼的各個部分葱峡,難以維護。AOP就是把這些問題和主業(yè)務邏輯分開龙助,達到與主業(yè)務邏輯解耦的目的砰奕。
傳統(tǒng)OOP是自上而下的邏輯開發(fā);
AOP是一種面向切面的編程思想提鸟。這些橫切性問題军援,把它們抽象為一個切面,關注點在切面的編程称勋,這就是所謂的AOP胸哥。
Spring AOP 簡介
如果說 IoC 是 Spring 的核心,那么面向切面編程就是 Spring 最為重要的功能之一了赡鲜,在數據庫事務中切面編程被廣泛使用空厌。
AOP應用場景:
日志記錄庐船,權限驗證,效率檢查嘲更,事務管理......
學習Spring最好的方式是從spring官方文檔入手.
AOP中的一些基本概念:
必須先知道這些基礎概念筐钟,要不后面看得一臉懵逼。
官網:AOP
個人認為理解順序應該為:
Join point:連接點赋朦,例如:servlet中的longin()就是連接點篓冲;所以連接點在spring中它永遠是一個方法。也可以說'目標對象中的方法就是一個連接點‘宠哄。
pointcut:切點纹因,就是連接點的集合!
Weaving:織入:
Advice:通知琳拨,就字面意思瞭恰,但是有2個部分組成,通知內容和通知到哪里去狱庇。
通知類型:
Before :前置通知惊畏,在連接點方法前調用
After :后置通知,在連接點方法后調用
AfterReturning:返回通知密任,在連接點方法執(zhí)行并正常返回后調用颜启,要求連接點方法在執(zhí)行過程中沒有發(fā)生異常
AfterThrowing:異常通知,當連接點方法異常時調用
Around:環(huán)繞通知浪讳,它將覆蓋原有方法缰盏,但是允許你通過反射調用原有方法,后面會講
Aspect:切面淹遵!包括連接點口猜,切點,通知的一個載體透揣。(如果用AspectJ它就是一個類济炎,如果用springXML的時候它就是一個標簽)并且交給spring管理。
Target object:目標對象辐真,原始對象须尚。
AOP proxy:代理對象, 包含了原始對象的代碼和增強后的代碼的那個對象侍咱。
Introduction:引入耐床,個人理解為實現(xiàn)接口;
代碼驗證為:
@DeclareParents(value="com.vince.dao.*", defaultImpl=IndexDao.class)
public static Dao dao;
com.vince.dao.*下的所有類默認實現(xiàn)了IndexDao.class
切點匹配表達式:
execution:可以定義到方法的的最小粒度是參數的返回類型楔脯,修飾符撩轰,包名,類名,方法名钧敞,Spring AOP主要也是使用這個匹配表達式蜡豹。
within:只能定義到類
this:當前生成的代理對象的類型匹配
target:目標對象類型匹配
args:只針對參數
execution和within的區(qū)別:
他們的主要區(qū)別就是粒度,within主要是輔助溉苛,為了健全而存在的镜廉。
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern)?? throws-pattern?)
? 方法的可見性(不寫代表所有)?方法的返回類型? 方法所在類的全路徑名 愚战?方法名類型(方法的參數類型) 方法拋出的異常類型娇唯?
如果看的一臉懵逼....就借助代碼理解一下。
舉個栗子:
本篇只用到注解的方式:
首先引入包:
代碼:
只開啟了beforeWithin()和beforeExecution()這兩個通知
結果可以看出beforeExecution匹配了2個切入點寂玲,而beforeWithin匹配了全部的切入點塔插。如需測試代碼可以私信。
AOP的內容非常多拓哟,本文主要介紹了SpringAOP的一些基礎概念想许。
參考資料:
感覺寫得超級好:Spring(4)——面向切面編程(AOP模塊)
官網:AOP
本人才疏學淺,以上純屬個人理解断序,如有不對流纹,還望批評指正。