生活随笔
收集整理的這篇文章主要介紹了
Spring CGLlB动态代理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JDK 動態代理使用起來非常簡單,但是有一定的局限性,這是因為 JDK 動態代理必須要實現一個或多個接口,如果不希望實現接口,則可以使用 CGLIB 代理。
CGLIB(Code Generation Library)是一個高性能開源的代碼生成包,它被許多 AOP 框架所使用,其底層是通過使用一個小而快的字節碼處理框架 ASM(Java 字節碼操控框架)轉換字節碼并生成新的類。因此 CGLIB 要依賴于 ASM 的包,解壓 Spring 的核心包 spring-core-3.2.2.RELEASE.jar,文件目錄如下圖所示。
解壓的核心包中包含 cglib 和 asm,也就是說 Spring3.2.13 版本的核心包已經集成了 CGLIB 所需要的包,所以在開發中不需要另外導入 ASM 的 JAR 包了。下面通過案例演示實現 CGLIB 的代理過程。
1. 創建目標類 GoodsDao
在 com.mengma.dao 包下創建目標類 GoodsDao,在類中定義增、刪、改、查方法,并在每個方法編寫輸出語句,如下所示。
package com
.mengma
.dao
;public class GoodsDao {public void add() {System
.out
.println("添加商品...");}public void update() {System
.out
.println("修改商品...");}public void delete() {System
.out
.println("刪除商品...");}public void find() {System
.out
.println("修改商品...");}
}
2. 創建代理類 MyBeanFactory
在 src 目錄下創建一個名為 com.mengma.cglib 的包,該包下創建類 MyBeanFactory,如下所示。
package com
.mengma
.cglib
;import java
.lang
.reflect
.Method
;
import org
.springframework
.cglib
.proxy
.Enhancer
;
import org
.springframework
.cglib
.proxy
.MethodInterceptor
;
import org
.springframework
.cglib
.proxy
.MethodProxy
;
import com
.mengma
.dao
.GoodsDao
;
import com
.mengma
.jdk
.MyAspect
;public class MyBeanFactory {public static GoodsDao
getBean() {final GoodsDao goodsDao
= new GoodsDao();final MyAspect myAspect
= new MyAspect();Enhancer enhancer
= new Enhancer();enhancer
.setSuperclass(goodsDao
.getClass());enhancer
.setCallback(new MethodInterceptor() {@Overridepublic Object
intercept(Object proxy
, Method method
, Object
[] args
,MethodProxy methodProxy
) throws Throwable
{myAspect
.myBefore(); Object obj
= method
.invoke(goodsDao
, args
); myAspect
.myAfter(); return obj
;}});GoodsDao goodsDaoProxy
= (GoodsDao
) enhancer
.create();return goodsDaoProxy
;}
}
上述代碼中,應用了 CGLIB 的核心類 Enhancer。在第 19 行代碼調用了 Enhancer 類的 setSuperclass() 方法,確定目標對象。
第 21 行代碼調用 setCallback() 方法添加回調函數;第 24 行代碼的 intercept() 方法相當于 JDK 動態代理方式中的 invoke() 方法,該方法會在目標方法執行的前后,對切面類中的方法進行增強;第 33~34 行代碼調用 Enhancer 類的 create() 方法創建代理類,最后將代理類返回。
3. 創建測試類
在 com.mengma.cglib 包下創建測試類 CGLIBProxyTest,編輯后如下所示。
package com
.mengma
.cglib
;import org
.junit
.Test
;
import com
.mengma
.dao
.GoodsDao
;public class CGLIBProxyTest {@Testpublic void test() {GoodsDao goodsDao
= MyBeanFactory
.getBean();goodsDao
.add();goodsDao
.update();goodsDao
.delete();goodsDao
.find();}
}
上述代碼中,調用 getBean() 方法時,依然獲取的是 goodsDao 的代理對象,然后調用該對象的方法。使用 JUnit 測試運行 test() 方法,運行成功后,控制臺的輸出結果如下圖所示。
從輸出結果中可以看出,在調用目標類的方法前后,也成功調用了增強的代碼,由此說明,使用 CGLIB 代理的方式同樣實現了手動代理。
總結
以上是生活随笔為你收集整理的Spring CGLlB动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。