最近在看《Spring揭秘》里面AOP部分吼拥,利用最近兩三天的上班空余時間來簡單總結(jié)一下吧坑雅。
- AOP是什么
- AOP的實現(xiàn)
- AOP在Java上的實現(xiàn)
- AOP織入器
AOP是什么翠订?
AOP全稱"Aspect-Oriented Programming"婚夫,意為面向切面編程疗疟。使用AOP,我們可以對類似于Logging和Security等系統(tǒng)需求進(jìn)行模塊化的組織住练,簡化系統(tǒng)需求與實現(xiàn)之間的對比關(guān)系地啰,進(jìn)而使得整個系統(tǒng)的實現(xiàn)更具有模塊化
所以說,個人理解AOP其實算一種開發(fā)思想讲逛,在我們的軟件開發(fā)中亏吝,通過引入所謂切面
的概念來將日志記錄,權(quán)限控制等一些與業(yè)務(wù)邏輯關(guān)系不算太大的其他邏輯操作隔離開盏混,從而使得業(yè)務(wù)邏輯和其余的邏輯各自能夠更好地被組織蔚鸥,維護(hù),更具有模塊化许赃。
AOP的實現(xiàn)
AOL
AOP是一種理念止喷,需要一種方式來實現(xiàn)該理念。那么實現(xiàn)AOP的語言就成為AOL混聊,即Aspect-Oriented Language弹谁。那么AOP都有哪些語言實現(xiàn)方式呢?
- AspectJ(Java)
- AspectC
- AspectC++
- Aspect.Net
- AspectL(Lisp)
- AspectPHP
基本實現(xiàn)原理
- 靜態(tài)AOP
以AspectJ為代表,將實現(xiàn)后的Aspect編譯并織入到系統(tǒng)的靜態(tài)類中预愤。比如沟于,AspectJ會使用ajc編譯器將各個Aspect以java字節(jié)碼的形式編譯到系統(tǒng)的各個功能模塊中,以達(dá)到融合Aspect和Class的目的鳖粟。
靜態(tài)AOP的優(yōu)點:
Aspect直接以Java字節(jié)碼的形式編譯到Java類中社裆,Java虛擬機(jī)可以像通常一樣加載Java類運(yùn)行,不會對整個系統(tǒng)的運(yùn)行造成任何的性能損失向图。
缺點:
靈活性不夠泳秀。如果切點需要個改變,則需要重新修改代碼榄攀,重新編譯織入到系統(tǒng)中嗜傅。
- 動態(tài)AOP
動態(tài)AOP的織入過程在系統(tǒng)運(yùn)行開始之后進(jìn)行,而不是預(yù)先編譯到系統(tǒng)類中檩赢,而且織入的信息大都采用外部XML文件格式保存吕嘀,可以在調(diào)整織入點以及織入邏輯單元的同時,不必變更系統(tǒng)其他模塊贞瞒,甚至在系統(tǒng)運(yùn)行的時候偶房,也可以動態(tài)地更改織入邏輯。
動態(tài)AOP的代表有JBoss AOP军浆、Spring AOP等框架棕洋。
AOP在Java上的實現(xiàn)
1. 動態(tài)代理
2. 動態(tài)字節(jié)碼增強(qiáng)
3. 自定義類加載器
4. Java代碼生成
5. AOL擴(kuò)展
AOP中的關(guān)鍵字
-
Joinpoint: 代表要織入到系統(tǒng)中的執(zhí)行點。
常見的織入點有: 方法調(diào)用乒融、方法執(zhí)行掰盘、構(gòu)造方法調(diào)用、構(gòu)造方法執(zhí)行赞季、字段設(shè)置愧捕、字段獲取、異常處理執(zhí)行申钩、類初始化(靜態(tài)類型次绘、靜態(tài)塊)。
-
PointCut: 代表的是Joinpoint的表述方式撒遣,描述要在哪些地方進(jìn)行Joinpoint的織入断盛。
PointCut的表述方式有哪些: 正則表達(dá)式(普遍用法)、直接指定Joinpoint所在方法名稱愉舔、使用特定的PointCut表達(dá)語言。
Advice: 代表將會織入到Joinpoint的橫切邏輯伙菜。
Advice在Joinpoint位置執(zhí)行時機(jī)的差異或者完成功能的不同轩缤,可以分為多種具體形式:Before Advice、After Adivce、After returning Advice火的、After throwing Advice壶愤、After Finally Advice、Around Advice馏鹤、Introduction征椒。
- Aspect: 代表對系統(tǒng)中的橫切關(guān)注點邏輯進(jìn)行模塊化封裝的AOP實體概念
AOP織入器
需要將我們之前定義好的那些橫切邏輯織入到原來的業(yè)務(wù)代碼中,就需要用到一個叫織入器
的東西
常見織入器有:
- AspectJ 技術(shù)的
ajc
織入器 - JBoss AOP 采用
自定義類加載器
作為織入器來完成織入 - Spring AOP 將
ProxyFactory
作為 織入器來完成織入