AOP是什么
AOP是面向切面編程,其目的是將橫切關注點從核心業務代碼中分離出來,通過動態代理等方式,實現代碼的增強和解耦,使得其具有更好的可維護性和可擴展性。
其中橫切關注點是多個類或對象的公共行為,如事務管理、日志記錄、接口限流、權限控制等。
AOP解決了什么
AOP解決了在面向對象編程中,不能很好地處理一些分散的類或對象的公共行為的問題,因為在不使用AOP的情況下,每個類或對象中都需要編寫這些行為執行邏輯的代碼,導致代碼冗余、復雜難以維護,因此引入了AOP機制,將這些公共行為的邏輯代碼從核心業務代碼中分離出來。
AOP常見術語
1、橫切關注點:多個對象或方法共同行為。
2、切面:將橫切關注點封裝成類,每一個類就是一個切面。
3、連接點:方法調用或執行時的某個時刻,如方法調用、異常拋出。
4、通知:指在某個連接點處執行的具體操作,通知包含前置(@Before)、后置(@After)、異常(@AfterThrowing)、返回(@AfterReturning)、環繞(@Around)通知這五種,其中前四種在目標方法執行前后執行,環繞通知可在方法執行的過程中執行。
5、切點:是一個表達式,用于指定哪些連接點需要切面增強。
6、織入:將切面和目標對象連接起來的過程,即在切點配置的連接點處應用通知的過程,包含編譯期織入和運行期織入兩種方式。
AOP和AspectJ對比
AOP是通過動態代理實現的,屬于運行時增強,且需要依賴于Spring容器,使用javac編譯器實現。對于被代理的類,若實現了接口,則使用JDK實現動態代理,反之使用Cglib實現。使用該方法時,由于容器啟動時需要生成代理對象且在方法調用上會增加棧的深度,切面在代理中執行,因此AOP的效率相比于AspectJ來說較低。同時對于織入,僅支持方法級的織入。
AspectJ屬于編譯時增強,可單獨使用或整合到其他框架中,需要使用的編譯器為ajc。同時,其屬于靜態織入,通過修改代碼完成,在實際運行前就已經完成了對切面的織入,生成的類沒有額外的開銷。支持編譯時、編譯后、加載時織入,同時可編織字段、方法、構造函數、靜態初始值等。
多個切面優先級確定
由于切面是一個類,要使一個類為切面,首先需要對該類加上注解@Aspect,要控制多個切面執行的順序,可使用兩種方法:
1、使用@Order注解,并令注解中的值為一個數值,數值越小優先級越高;
2、實現Ordered接口,并重寫order方法,該方法返回一個整數,代表優先級的大小,數值越小優先級越高。