當一個對象(客戶端)不能或者不想直接引用另外一個對象(目標對象),這時能夠應用代理模式在這二者之間構建一個橋樑--代理對象。按照代理對象的建立時期不一樣,能夠分爲兩種:java
靜態代理:程序員事先寫好代理對象類,在程序發佈前就已經存在了;程序員
動態代理:應用程序發佈後,經過動態建立代理對象。spring
其中動態代理又可分爲:spa
此時代理對象和目標對象實現了相同的接口,目標對象做爲代理對象的一個屬性,具體接口實現中,能夠在調用目標對象相應方法先後加上其餘業務處理邏輯。.net
代理模式在實際使用時須要指定具體的目標對象,若是爲每一個類都添加一個代理類的話,會致使類不少,同時若是不知道具體類的話,怎樣實現代理模式呢?這就引出動態代理。代理
JDK動態代理只能針對實現了接口的類生成代理。code
CGLIB(CODE GENERLIZE LIBRARY)代理是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的全部方法,因此該類或方法不能聲明稱final的。xml
若是目標對象沒有實現接口,則默認會採用CGLIB代理;對象
若是目標對象實現了接口,能夠強制使用CGLIB實現代理(添加CGLIB庫,並在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)。接口
AOP包括切面(aspect)、通知(advice)、鏈接點(joinpoint),實現方式就是經過對目標對象的代理在鏈接點先後加入通知,完成統一的切面操做。
java動態代理是利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。而cglib動態代理是利用asm開源包,對代理對象類的class文件加載進來,經過修改其字節碼生成子類來處理。
一、若是目標對象實現了接口,默認狀況下會採用JDK的動態代理實現AOP
二、若是目標對象實現了接口,能夠強制使用CGLIB實現AOP
三、若是目標對象沒有實現了接口,必須採用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換
Spring中若是要強制全部代理均採用CGLIB,則要增長AOP
<!-- proxy-target-class默認"false",更改成"ture"使用CGLib動態代理 --> <aop:aspectj-autoproxy proxy-target-class="true" />