AOP入門(mén)

最近在看《Spring揭秘》里面AOP部分,利用最近兩三天的上班空余時(shí)間來(lái)簡(jiǎn)單總結(jié)一下吧。

  1. AOP是什么
  1. AOP的實(shí)現(xiàn)
  2. AOP在Java上的實(shí)現(xiàn)
  3. 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)原理

  1. 靜態(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)中。

  1. 動(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)完成織入
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容