一、有了OOP,為什么還需要AOP?
- 我們在精熟了OOP的方方面面,包括什么設(shè)計模式。但是我們還是無法解決某些問題。
- 對于系統(tǒng)中普通的業(yè)務(wù)關(guān)注點,OOP可以很好地對其進行分解并使之模塊化,但卻無法更好地避免類似于系統(tǒng)需求地實現(xiàn)在系統(tǒng)中各處散落這樣地問題。(安全檢查、系統(tǒng)日志、事務(wù)管理)
二、AOP的尷尬?
- AOP現(xiàn)在沒有主權(quán),所以,現(xiàn)時代的AOP實現(xiàn)都需要“寄生”于OOP的主權(quán)領(lǐng)土中。
三、靜態(tài)AOP
- 以AspectJ為例:相應(yīng)的橫切關(guān)注點以Aspect形式實現(xiàn)之后,會通過特定的編譯器,將實現(xiàn)后的Aspect編譯并織入到系統(tǒng)的靜態(tài)類中。
- 優(yōu)點:Aspect直接以java字節(jié)碼的形式編譯到j(luò)ava類中,jvm可以像通常一樣加載java類運行,幾乎沒有性能損失。
- 缺點:不夠靈活,一旦需要修改,就需要重新編譯,重新織入。
四、動態(tài)AOP
- 動態(tài)代理:可以在運行期間,為相應(yīng)的接口動態(tài)生成對應(yīng)的代理對象。
- 缺點:所有需要織入橫切關(guān)注點邏輯的模塊類都得實現(xiàn)相應(yīng)得接口,因為動態(tài)代理機制只針對接口有效。Spring默認采用這種機制。
- 優(yōu)點:相比于動態(tài)字節(jié)碼增強,性能由一定得優(yōu)勢,因為這是通過JVM做的,性能差不多是1.5倍
- 動態(tài)字節(jié)碼增強:在運行期間,通過動態(tài)字節(jié)碼增強技術(shù)為這些系統(tǒng)模塊類生成相應(yīng)的子類,而將橫切邏輯加到這些子類中,讓應(yīng)用程序在執(zhí)行期間使用的是這些動態(tài)生成的子類,從而達到將橫切邏輯織入系統(tǒng)的目的。
- 優(yōu)點:目標類不再不需要實現(xiàn)相應(yīng)的接口,擺脫了接口,spring在動態(tài)代理不能用的時候,采用cglib。
五、自定義類加載器
- 在class文件加載期間,將橫切邏輯,進行織入,然后進行偷梁換柱。。。