最近在看《Spring揭秘》里面AOP部分,利用最近兩三天的上班空余時(shí)間來(lái)簡(jiǎn)單總結(jié)一下吧。
- AOP是什么
- AOP的實(shí)現(xiàn)
- AOP在Java上的實(shí)現(xiàn)
- AOP織入器
AOP是什么?
AOP全稱(chēng)"Aspect-Oriented Programming",意為面向切面編程。使用AOP,我們可以對(duì)類(lèi)似于Logging和Security等系統(tǒng)需求進(jìn)行模塊化的組織,簡(jiǎn)化系統(tǒng)需求與實(shí)現(xiàn)之間的對(duì)比關(guān)系,進(jìn)而使得整個(gè)系統(tǒng)的實(shí)現(xiàn)更具有模塊化
所以說(shuō),個(gè)人理解AOP其實(shí)算一種開(kāi)發(fā)思想,在我們的軟件開(kāi)發(fā)中,通過(guò)引入所謂切面
的概念來(lái)將日志記錄,權(quán)限控制等一些與業(yè)務(wù)邏輯關(guān)系不算太大的其他邏輯操作隔離開(kāi),從而使得業(yè)務(wù)邏輯和其余的邏輯各自能夠更好地被組織,維護(hù),更具有模塊化。
AOP的實(shí)現(xiàn)
AOL
AOP是一種理念,需要一種方式來(lái)實(shí)現(xiàn)該理念。那么實(shí)現(xiàn)AOP的語(yǔ)言就成為AOL,即Aspect-Oriented Language。那么AOP都有哪些語(yǔ)言實(shí)現(xiàn)方式呢?
- AspectJ(Java)
- AspectC
- AspectC++
- Aspect.Net
- AspectL(Lisp)
- AspectPHP
基本實(shí)現(xiàn)原理
- 靜態(tài)AOP
以AspectJ為代表,將實(shí)現(xiàn)后的Aspect編譯并織入到系統(tǒng)的靜態(tài)類(lèi)中。比如,AspectJ會(huì)使用ajc編譯器將各個(gè)Aspect以java字節(jié)碼的形式編譯到系統(tǒng)的各個(gè)功能模塊中,以達(dá)到融合Aspect和Class的目的。
靜態(tài)AOP的優(yōu)點(diǎn):
Aspect直接以Java字節(jié)碼的形式編譯到Java類(lèi)中,Java虛擬機(jī)可以像通常一樣加載Java類(lèi)運(yùn)行,不會(huì)對(duì)整個(gè)系統(tǒng)的運(yùn)行造成任何的性能損失。
缺點(diǎn):
靈活性不夠。如果切點(diǎn)需要個(gè)改變,則需要重新修改代碼,重新編譯織入到系統(tǒng)中。
- 動(dòng)態(tài)AOP
動(dòng)態(tài)AOP的織入過(guò)程在系統(tǒng)運(yùn)行開(kāi)始之后進(jìn)行,而不是預(yù)先編譯到系統(tǒng)類(lèi)中,而且織入的信息大都采用外部XML文件格式保存,可以在調(diào)整織入點(diǎn)以及織入邏輯單元的同時(shí),不必變更系統(tǒng)其他模塊,甚至在系統(tǒng)運(yùn)行的時(shí)候,也可以動(dòng)態(tài)地更改織入邏輯。
動(dòng)態(tài)AOP的代表有JBoss AOP、Spring AOP等框架。
AOP在Java上的實(shí)現(xiàn)
1. 動(dòng)態(tài)代理
2. 動(dòng)態(tài)字節(jié)碼增強(qiáng)
3. 自定義類(lèi)加載器
4. Java代碼生成
5. AOL擴(kuò)展
AOP中的關(guān)鍵字
-
Joinpoint: 代表要織入到系統(tǒng)中的執(zhí)行點(diǎn)。
常見(jiàn)的織入點(diǎn)有: 方法調(diào)用、方法執(zhí)行、構(gòu)造方法調(diào)用、構(gòu)造方法執(zhí)行、字段設(shè)置、字段獲取、異常處理執(zhí)行、類(lèi)初始化(靜態(tài)類(lèi)型、靜態(tài)塊)。
-
PointCut: 代表的是Joinpoint的表述方式,描述要在哪些地方進(jìn)行Joinpoint的織入。
PointCut的表述方式有哪些: 正則表達(dá)式(普遍用法)、直接指定Joinpoint所在方法名稱(chēng)、使用特定的PointCut表達(dá)語(yǔ)言。
Advice: 代表將會(huì)織入到Joinpoint的橫切邏輯。
Advice在Joinpoint位置執(zhí)行時(shí)機(jī)的差異或者完成功能的不同,可以分為多種具體形式:Before Advice、After Adivce、After returning Advice、After throwing Advice、After Finally Advice、Around Advice、Introduction。
- Aspect: 代表對(duì)系統(tǒng)中的橫切關(guān)注點(diǎn)邏輯進(jìn)行模塊化封裝的AOP實(shí)體概念
AOP織入器
需要將我們之前定義好的那些橫切邏輯織入到原來(lái)的業(yè)務(wù)代碼中,就需要用到一個(gè)叫織入器
的東西
常見(jiàn)織入器有:
- AspectJ 技術(shù)的
ajc
織入器 - JBoss AOP 采用
自定義類(lèi)加載器
作為織入器來(lái)完成織入 - Spring AOP 將
ProxyFactory
作為 織入器來(lái)完成織入