Spring兩種動态代理的差別
Spring的面向切面程式設計也是基于動态代理來實作的
- 靜态代理:也就是自己手動建立的代理對象
- 動态代理:也就是在程式運作中通過配置參生的
那麼Spring的AOP也就是面向切面程式設計,就是基于動态代理來實作的,通過代理原始類增加額外功能,我們可以将額外功能一次定義然後配合切點達到多次使用的效果,比如 做日志啊 事物啊 時間啊等等…提高了複用性 開發效率.
那麼在Spirng當中動态代理有兩種
-
第一種也就是JDK自帶的動态代理
1.JDK動态代理是利用反射機制生成一個實作代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理.
需要指定一個類加載器,然後生成的代理對象實作類的接口或類的類型,接着處理額外功能.
JDK是基于接口
-
第二隻也就是Cglib的動态代理
2.Cglib是動态代理利用asm的開源包,對代理對象的Class檔案加載進來,通過修改其位元組碼生成的子類來處理
Cglib是基于繼承父類生成的代理類.
在Spirng當中動态代理的使用
1.如果目标對象實作了接口,預設情況下會采用JDK的動态代理來實作AOP
2.如果目标對象實作了接口,也可以強制使用CGlib來實作AOP
3.如果目标對象沒有實作接口,必須采用Cglib庫,Spirng會自動在JDK和CGlib用切換
如何強制使用CGlib來實作AOP?
1.添加CGlibjar包:SPRING_HOME/cglib/*.jar
2.在Spring的配置檔案中加入 //預設是false 也就是用JDK的 改為true就是用Cglib的
JDK和動态代理和CGlib位元組碼的生成差別?
1.JDK動态代理制能對實作了接口的類生成代理,而不是針對類
2.CGLIB是針對類實作代理,主要對指定的類生成一個子類,覆寫其中的方法,添加額外功能,因為是繼承,是以該類方法不能用final來聲明.