天天看點

Spring兩種動态代理的差別Spring兩種動态代理的差別

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來聲明.

下一篇: 進項稅