由于最近項目中經(jīng)常使用到AOP,在寫這篇博客之前,我對于AspectJ 框架 aop 和 Spring aop 的區(qū)別以及概念都是比較模糊的,希望讀者可以通過這篇博客,深入的了解 AspectJ 框架是如何進行切面處理的。

如圖1所示,在編寫業(yè)務(wù)代碼過程中,從業(yè)務(wù)邏輯角度劃分,可以分為業(yè)務(wù)相關(guān)代碼和非業(yè)務(wù)相關(guān)代碼。業(yè)務(wù)代碼是功能實現(xiàn)的基礎(chǔ),但是非業(yè)務(wù)代碼在整個過程中也扮演者一個非常重要的角色,例如:添加緩存,方法性能監(jiān)控等等。有沒有什么辦法可以將兩者相隔離呢?
AOP:全稱?Aspect Oriented Programming,面向切面編程。
AOP 技術(shù)為業(yè)務(wù)邏輯代碼與非業(yè)務(wù)邏輯代碼的隔離提供了一種有效的解決方案。

如上圖所示,使用 AOP 技術(shù),可以將業(yè)務(wù)邏輯代碼與非業(yè)務(wù)邏輯代碼相互隔離,互不影響。
AOP 技術(shù)如何實現(xiàn)?
最早的實現(xiàn) AOP 技術(shù)使用到的是 AspectJ 框架,實現(xiàn)的原理為靜態(tài)織入。在編譯時期,優(yōu)先編譯非業(yè)務(wù)相關(guān)代碼,然后在編譯業(yè)務(wù)代碼時將非業(yè)務(wù)代碼織入,以達到橫切的效果(本文主要講解的 AspectJ框架)。在講解實例之前,先普及兩個概念
1、pointcut :切點,即需要使用 AOP 的點。
2、advice:通知,即想要在切點處進行哪些具體的操作。
下面介紹 AspectJ 實現(xiàn) AOP 的兩種形式,編碼以及使用注解的方式。

如圖三所示,ProcessData 類中有一個 saveDB() 保存數(shù)據(jù)的方法,在執(zhí)行該方法前,需要打印一下請求的日志,請求完成之后,也需要打印日志。打印日志和業(yè)務(wù)邏輯其實是沒有任何關(guān)聯(lián)的,但是又是必須需要的,寫在業(yè)務(wù)邏輯代碼中,會顯得很臃腫,這時就可以使用 AOP 技術(shù)。
1、使用編碼方式使用 AspectJ 框架


如上圖所示,圖四將非業(yè)務(wù)邏輯代碼抽取出來,進行切面處理。圖五只進行業(yè)務(wù)邏輯處理。打印結(jié)果和不使用AOP的結(jié)果是一致的。需要注意的點是,AspectJ 框架的編譯器不是 javac,而是 Ajc,Ajc可以認為是javac的增強版本,在使用 Aspect? 進行編碼測試 AOP 時,需要手動的修改編譯器,IDEA 修改方法:File->setting->Build,Execution,Devlopment->Compiler->Java Compiler? use compiler改為 Ajc。如下圖所示:

使用 AspectJ 框架進行 AOP 之后,反編譯代碼,業(yè)務(wù)邏輯代碼被非業(yè)務(wù)邏輯代碼靜態(tài)織入了,如下圖所示:

2、使用注解方式使用 AspectJ 框架

需要注意的是,使用 @Aspect 注解進行橫切的時候,也是需要配置編譯器,使用的是 Ajc。
下一節(jié)將講述的是Spring AOP 中是如何兼容 Aspect 框架的。?