日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring CGLlB动态代理

發布時間:2025/3/12 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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();// 生成代理類,CGLIB在運行時,生成指定對象的子類,增強Enhancer enhancer = new Enhancer();// 確定需要增強的類enhancer.setSuperclass(goodsDao.getClass());// 添加回調函數enhancer.setCallback(new MethodInterceptor() {// intercept 相當于 jdk invoke,前三個參數與 jdk invoke—致@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() {// 從工廠獲得指定的內容(相當于spring獲得,但此內容時代理對象)GoodsDao goodsDao = MyBeanFactory.getBean();// 執行方法goodsDao.add();goodsDao.update();goodsDao.delete();goodsDao.find();} }

上述代碼中,調用 getBean() 方法時,依然獲取的是 goodsDao 的代理對象,然后調用該對象的方法。使用 JUnit 測試運行 test() 方法,運行成功后,控制臺的輸出結果如下圖所示。

從輸出結果中可以看出,在調用目標類的方法前后,也成功調用了增強的代碼,由此說明,使用 CGLIB 代理的方式同樣實現了手動代理。

總結

以上是生活随笔為你收集整理的Spring CGLlB动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。