AOP學習總結(jié)-簡介

AOP 全名 Aspect Oriented Programming扬蕊,意思是面向切面編程搀别。
AOP 跟 OOP 一樣,是一種編程思想尾抑。
如果 OOP 是縱向思想的話歇父,那么 AOP 就是橫向思想≡儆可以看下圖的差別:


15572175991582.jpg

OOP 與 AOP 的區(qū)別

面向目標不同:簡單來說 OOP 是面向名詞領(lǐng)域榜苫,AOP 面向動詞領(lǐng)域。
思想結(jié)構(gòu)不同:OOP 是縱向結(jié)構(gòu)翎冲,AOP 是橫向結(jié)構(gòu)垂睬。
注重方面不同:OOP 注重業(yè)務(wù)邏輯單元的劃分,AOP 偏重業(yè)務(wù)處理過程中的某個步驟或階段。

為什么要 AOP

在 Android 的架構(gòu)演進中驹饺,從 MVC 到 MVP 到 MVVM 再到 模塊化 和 組件化钳枕,可以看到每種架構(gòu)它們想解決的共同問題是如何更加精細地分離業(yè)務(wù)邏輯,并且處理好它們直接的關(guān)系赏壹,盡可能的將關(guān)注點集中在某一個模塊或者組件中鱼炒,所以可以這樣理解:

最佳的系統(tǒng)架構(gòu)由模塊化的關(guān)注面領(lǐng)域組成,每個關(guān)注面均用純 Java 對象(當然還可以用其他蝌借,這里強調(diào)的是用面向?qū)ο蟮乃枷耄崿F(xiàn)昔瞧。不同的領(lǐng)域之間用最不具有侵害性的「方面」或「類方面」工具整合起來(比如路由等)。

但是有一個問題需要我們反思:

雖然我們進行了模塊化或者組件化骨望,但是有很多模塊沒有做到恰當?shù)厍蟹株P(guān)注面硬爆,往往在業(yè)務(wù)邏輯中耦合了業(yè)務(wù)埋點、權(quán)限申請擎鸠、登陸狀態(tài)的判斷缀磕、對不可預(yù)知異常 try-catch 和一些持久化操作等等毫炉。

是否有一種方法可以把這些更好的解偶出來呢罐监,用 AOP 是一種不錯的選擇驶乾,「切分關(guān)注面」就是 AOP 的思想讯柔,它可以被看成是 OOP 的一種補充亩鬼。

AOP 的作用

AOP 的作用有很多本谜,舉例有 參數(shù)判空和校驗纹冤,權(quán)限驗證清酥,無埋點上報雄可,性能監(jiān)控凿傅,日志記錄,統(tǒng)一緩存代理数苫,
熱修改聪舒,異常捕獲,事件防抖虐急,事務(wù)處理等等箱残。

目前使用到 AOP 思想的比較有名的框架有:DataBinding,Dagger2止吁,ButterKnfie被辑,EventBus3,Room敬惦,DBFlow盼理,AndroidAnnotation,F(xiàn)ragmentRigger 等等俄删。

可見 AOP 的作用是挺大的榜揖。

AOP 的實現(xiàn)方式

動態(tài)織入 Hook 方式

在運行期勾哩,目標類加載后,為接口動態(tài)生成代理類举哟,將切面植入到代理類中思劳。相對于靜態(tài)AOP更加靈活。但切入的關(guān)注點需要實現(xiàn)接口妨猩。

實現(xiàn)方式有:Dexposed潜叛,Xposed,epic

動態(tài)字節(jié)碼生成

原理是在運行期間目標字節(jié)碼加載后壶硅,通過字節(jié)碼技術(shù)為一個類創(chuàng)建子類威兜,并在子類中采用方法攔截的技術(shù)攔截所有父類方法的調(diào)用,順勢織入橫切邏輯庐椒。由于是通過子類來代理父類椒舵,因此不能代理被 final 字段修飾的方法。

實現(xiàn)方式有:Cglib + Dexmaker

靜態(tài)織入方式

  1. 在編譯期織入约谈,切面直接以字節(jié)碼的形式編譯到目標字節(jié)碼文件中笔宿,這要求使用特殊的 Java 編譯器。
  2. 在類裝載期織入棱诱,這要求使用特殊的類裝載器泼橘。

實現(xiàn)方式有:APT,AspectJ迈勋,ASM炬灭,Javassist,DexMaker靡菇,ASMDEX

通過一張圖理解他們的關(guān)系:


15572191917505.jpg

他們的區(qū)別就是插入的時機不同重归。

常用的 AOP 實現(xiàn)方法有 APT,AspectJ厦凤,Javassist鼻吮。其他相對來說比較不常用。

APT

說到 APT 泳唠,那就離不開注解狈网,Android 解析注解主要有兩種實現(xiàn)宙搬。

第一種是運行期通過反射去解析當前類笨腥,注入相應(yīng)要運行的方法。這種方法最大的缺點就是性能問題勇垛,因為用了反射脖母。大量使用會導(dǎo)致 app 性能下降,比如早期的 butterknife 框架闲孤。

第二種是通過編譯器生成類的代理類谆级,在運行期直接調(diào)用代理類的代理方法烤礁。這種方法的優(yōu)點就是沒有性能問題,缺點可能就是如果使用很多會生成比較多的代理類肥照,帶上控制得當?shù)脑拺?yīng)該沒什么問題脚仔,比如現(xiàn)在的 butterknife,EventBus3舆绎,Room 框架等鲤脏。

APT 就是指第二種方法。

在編寫 APT 代理類時吕朵,往往有自動生成源代碼的需要猎醇,我們不可能自己手動拼接字符串,這時候可以用 J 神的 JavaPoet 框架去解決努溃。

AspectJ

AspectJ 是目前來說比較好的 AOP 框架了硫嘶,它完全兼容 Java,而且使用起來比較簡單梧税。

但在 Android 上集成比較麻煩沦疾,這時候可以通過一些大神們提供的插件解決:

  1. J 神的 Hugo
  2. gradle_plugin_android_aspectjx

Javassist

使用 Javassist 的代表框架有 熱修復(fù)框架HotFix 、Savior(InstantRun)

Javassist 是一個編輯字節(jié)碼的框架贡蓖,作用是修改編譯后的 class 字節(jié)碼

實現(xiàn) Javassist 的方式可以通過自定義 gradle 插件曹鸠,利用 Gradle Transfrom 這個 api 去實現(xiàn)。原因是 Transform 更為方便斥铺,我們不再需要插入到某個Task前面彻桃。Tranfrom 有自己的執(zhí)行時機,一經(jīng)注冊便會自動添加到 Task 執(zhí)行序列中晾蜘,且正好是 class 被打包成 dex 之前邻眷。

參考文章:一文讀懂 AOP | 你想要的最全面 AOP 方法探討

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市剔交,隨后出現(xiàn)的幾起案子肆饶,更是在濱河造成了極大的恐慌,老刑警劉巖岖常,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驯镊,死亡現(xiàn)場離奇詭異,居然都是意外死亡竭鞍,警方通過查閱死者的電腦和手機板惑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偎快,“玉大人冯乘,你說我怎么就攤上這事∩辜校” “怎么了裆馒?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵姊氓,是天一觀的道長。 經(jīng)常有香客問我喷好,道長翔横,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任梗搅,我火速辦了婚禮棕孙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘些膨。我一直安慰自己蟀俊,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布订雾。 她就那樣靜靜地躺著肢预,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洼哎。 梳的紋絲不亂的頭發(fā)上烫映,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音噩峦,去河邊找鬼锭沟。 笑死,一個胖子當著我的面吹牛识补,可吹牛的內(nèi)容都是我干的族淮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼凭涂,長吁一口氣:“原來是場噩夢啊……” “哼祝辣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起切油,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蝙斜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澎胡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孕荠,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年攻谁,在試婚紗的時候發(fā)現(xiàn)自己被綠了稚伍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡巢株,死狀恐怖槐瑞,靈堂內(nèi)的尸體忽然破棺而出熙涤,到底是詐尸還是另有隱情阁苞,我是刑警寧澤困檩,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站那槽,受9級特大地震影響悼沿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骚灸,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一糟趾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甚牲,春花似錦义郑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雏赦,卻和暖如春劫笙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背星岗。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工填大, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俏橘。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓允华,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寥掐。 傳聞我的和親對象是個殘疾皇子例获,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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