1. 程式人生 > >AOP靜態代理與動態代理

AOP靜態代理與動態代理

AOP

面相切面程式設計,是作為面向物件的一種補充,用於處理系統中分佈於各個模組的橫切關注點,比如事務管理,日誌,快取,異常等。

AOP代理分類

靜態代理和動態代理

靜態代理

靜態代理就是AOP框架會在編譯階段將Aspect植入java位元組碼中,生成AOP代理類,在執行的時候,是直接執行其增強的AOP物件,因此也稱為編譯時增強(反編譯*.class可以發現和原始碼不一樣);AspectJ就是典型的靜態代理增強;

動態代理

動態代理就是說AOP框架不會去修改位元組碼,而是在記憶體中臨時為方法生成一個AOP物件,這個AOP物件包含了目標物件的全部方法,並且在特定的切點做了增強處理,並回調對方的方法;Spring AOP使用的是動態代理

Spring AOP中動態代理的分類

JDK動態代理和CGLiB動態代理

JDK動態代理

通過反射來接受被代理的類,並且要求被代理的類必須實現一個介面;

JDK動態代理的核心是InvocationHandler介面和Proxy類

CGLIB動態代理

如果目標類,沒有實現介面,那麼spring AOP會選擇使用CGLIB來動態代理目標類;

CGLIB(Code Generation Library)是一個程式碼生成的類庫,可以再執行時動態的生成某個類的子類;

注意CGLiB是通過整合的方式做的動態代理,因此如果某個類是final,是無法使用CGLIB動態代理的;

同理,由於是繼承方式,如果是 static方法,private方法,final方法等描述的方法是不能被代理的