天天看點

AOP的兩種動态代理機制

從多處拷貝粘貼而來,原文無處可考了,感謝幾位原創者的付出

JDK動态代理和Cglib動态代理

寫了個小demo,GitHub:https://github.com/ConanDennis/dynamicProxyDemo

JDK靜态代理:

jdk靜态代理實作比較簡單,一般是直接代理對象直接包裝了被代理對象

JDK動态代理:

1.能夠繼承靜态代理的全部優點.并且能夠實作代碼的複用.

2.動态代理可以處理一類業務.隻要滿足條件 都可以通過代理對象進行處理.

3.動态代理的靈活性不強.

4.JDK 的動态代理要求代理者必須實作接口, , 否則不能生成代理對象. .

Cglib動态代理:

1.不管有無接口都可以建立代理對象.

2.cglib建立的代理對象是目标對象的子類.

注意:要在pom中引入cglib依賴

<dependency> 

<groupId>cglib</groupId> 

<artifactId>cglib</artifactId> 

<version>

2.2

.

2

</version> 

</dependency> 

使用spring的AOP代理對象生成政策:

1.在spring中預設條件下如果目标對象有接口,則使用JDK的動态代理.

 如果目标對象沒有接口則預設使用cgLib動态代理.

2.當從容器中擷取對象時,如果擷取的對象滿足切入點表達式.那麼就會為其創

建代理對象.代理對象指定方法就會執行與切入點綁定的通知方法.

優缺點

jdk靜态代理類隻能為一個被代理類服務,如果需要代理的類比較多,那麼會産生過多的代理類。jdk靜态代理在編譯時産生class檔案,運作時無需産生,可直接使用,效率好。

jdk動态代理必須實作接口,通過反射來動态代理方法,消耗系統性能。但是無需産生過多的代理類,避免了重複代碼的産生,系統更加靈活。

cglib動态代理無需實作接口,通過生成子類位元組碼來實作,比反射快一點,沒有性能問題。但是由于cglib會繼承被代理類,需要重寫被代理方法,是以被代理類不能是final類,被代理方法不能是final。

是以,cglib的應用更加廣泛一點。