最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring CGLlB動態(tài)代理實現(xiàn)過程解析

 更新時間:2019年10月30日 09:56:34   作者:流氓大隊長  
這篇文章主要介紹了Spring CGLlB動態(tài)代理實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

JDK 動態(tài)代理使用起來非常簡單,但是它也有一定的局限性,這是因為 JDK 動態(tài)代理必須要實現(xiàn)一個或多個接口,如果不希望實現(xiàn)接口,則可以使用 CGLIB 代理。

CGLIB(Code Generation Library)是一個高性能開源的代碼生成包,它被許多 AOP 框架所使用,其底層是通過使用一個小而快的字節(jié)碼處理框架 ASM(Java 字節(jié)碼操控框架)轉換字節(jié)碼并生成新的類。因此 CGLIB 要依賴于 ASM 的包,解壓 Spring 的核心包 spring-core-3.2.2.RELEASE.jar,文件目錄如圖 1 所示。

圖 1 spring-core-3.2.2.RELEASE.jar文件

在圖 1 中可以看出,解壓的核心包中包含 cglib 和 asm,也就是說 Spring3.2.13 版本的核心包已經(jīng)集成了 CGLIB 所需要的包,所以在開發(fā)中不需要另外導入 ASM 的 JAR 包了。下面通過案例演示實現(xiàn) CGLIB 的代理過程。

1. 創(chuàng)建目標類 GoodsDao

在 com.mengma.dao 包下創(chuàng)建目標類 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. 創(chuàng)建代理類 MyBeanFactory

在 src 目錄下創(chuàng)建一個名為 com.mengma.cglib 的包,該包下創(chuàng)建類 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();
    // 創(chuàng)建切面類實例
    final MyAspect myAspect = new MyAspect();
    // 生成代理類,CGLIB在運行時,生成指定對象的子類,增強
    Enhancer enhancer = new Enhancer();
    // 確定需要增強的類
    enhancer.setSuperclass(goodsDao.getClass());
    // 添加回調函數(shù)
    enhancer.setCallback(new MethodInterceptor() {
      // intercept 相當于 jdk invoke,前三個參數(shù)與 jdk invoke—致
      @Override
      public Object intercept(Object proxy, Method method, Object[] args,
          MethodProxy methodProxy) throws Throwable {
        myAspect.myBefore(); // 前增強
        Object obj = method.invoke(goodsDao, args); // 目標方法執(zhí)行
        myAspect.myAfter(); // 后增強
        return obj;
      }
    });
    // 創(chuàng)建代理類
    GoodsDao goodsDaoProxy = (GoodsDao) enhancer.create();
    return goodsDaoProxy;
  }
}

上述代碼中,應用了 CGLIB 的核心類 Enhancer。在第 19 行代碼調用了 Enhancer 類的 setSuperclass() 方法,確定目標對象。

第 21 行代碼調用 setCallback() 方法添加回調函數(shù);第 24 行代碼的 intercept() 方法相當于 JDK 動態(tài)代理方式中的 invoke() 方法,該方法會在目標方法執(zhí)行的前后,對切面類中的方法進行增強;第 33~34 行代碼調用 Enhancer 類的 create() 方法創(chuàng)建代理類,最后將代理類返回。

3. 創(chuàng)建測試類

在 com.mengma.cglib 包下創(chuàng)建測試類 CGLIBProxyTest,編輯后如下所示。

package com.mengma.cglib;

import org.junit.Test;
import com.mengma.dao.GoodsDao;

public class CGLIBProxyTest {
  @Test
  public void test() {
    // 從工廠獲得指定的內容(相當于spring獲得,但此內容時代理對象)
    GoodsDao goodsDao = MyBeanFactory.getBean();
    // 執(zhí)行方法
    goodsDao.add();
    goodsDao.update();
    goodsDao.delete();
    goodsDao.find();
  }
}

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

圖 2 輸出結果

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 在js與java中判斷json數(shù)據(jù)中是否含有某字段的案例

    在js與java中判斷json數(shù)據(jù)中是否含有某字段的案例

    這篇文章主要介紹了在js與java中判斷json數(shù)據(jù)中是否含有某字段的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java實現(xiàn)年獸大作戰(zhàn)游戲詳解

    Java實現(xiàn)年獸大作戰(zhàn)游戲詳解

    春節(jié)要到了,看慣了前端各種小游戲,確實做得很好,很精致。本文將為大家介紹一款java版本的年獸大作戰(zhàn)游戲,感興趣的小伙伴可以試一試
    2022-01-01
  • 純Java實現(xiàn)數(shù)字證書生成簽名的簡單實例

    純Java實現(xiàn)數(shù)字證書生成簽名的簡單實例

    下面小編就為大家?guī)硪黄僇ava實現(xiàn)數(shù)字證書生成簽名的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • Java從List中刪除元素的幾種方式小結

    Java從List中刪除元素的幾種方式小結

    在Java中,List 接口提供了一個 remove(Object o) 方法來移除列表中與給定對象相等的第一個元素,然而,直接使用這個方法來刪除列表中的元素有時并不是最優(yōu)的選擇,主要原因包括效率和同步性問題,本文介紹了Java從List中刪除元素的幾種方式,需要的朋友可以參考下
    2024-08-08
  • java應用占用內存過高排查的解決方案

    java應用占用內存過高排查的解決方案

    這篇文章主要介紹了java應用占用內存過高排查的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 使用Java的Graphics類進行繪圖的方法詳解

    使用Java的Graphics類進行繪圖的方法詳解

    這篇文章主要介紹了使用Java的Graphics類進行繪圖的方法,是Java的GUI編程的基礎,需要的朋友可以參考下
    2015-10-10
  • springboot中實現(xiàn)通過后臺創(chuàng)建臨時表

    springboot中實現(xiàn)通過后臺創(chuàng)建臨時表

    這篇文章主要介紹了springboot中實現(xiàn)通過后臺創(chuàng)建臨時表操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 淺談Java繼承中的轉型及其內存分配

    淺談Java繼承中的轉型及其內存分配

    這篇文章主要介紹了淺談Java繼承中的轉型及其內存分配,首先分享了簡單的代碼及運行結果,然后對其進行分析,繼而引出了
    2017-11-11
  • Spring 異常處理的各種姿勢總結

    Spring 異常處理的各種姿勢總結

    這篇文章主要介紹了Spring 異常處理,總結分析了Spring 異常處理的各種常見操作技巧與相關使用注意事項,需要的朋友可以參考下
    2020-05-05
  • idea編譯器工程out目錄修改方法步驟

    idea編譯器工程out目錄修改方法步驟

    多個工程在一個文件夾下,有時會變?yōu)樗械墓こ讨挥靡粋€out文件夾,這時運行會出錯,所以本文就來介紹一下out目錄修改,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09

最新評論

玛多县| 旅游| 手游| 石柱| 柘城县| 镇康县| 疏附县| 康保县| 宜丰县| 福清市| 临清市| 汉寿县| 衡阳县| 常德市| 崇阳县| 邵东县| 梁山县| 鄱阳县| 厦门市| 阿拉善盟| 丹阳市| 文水县| 吉木乃县| 海淀区| 开阳县| 南召县| 盘山县| 敦煌市| 红安县| 逊克县| 建水县| 德州市| 太保市| 西昌市| 长春市| 米泉市| 鹤壁市| 吉木乃县| 慈利县| 高邑县| 黄石市|