從多處拷貝粘貼而來,原文無處可考了,感謝幾位原創者的付出
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的應用更加廣泛一點。