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

Spring JDK動(dòng)態(tài)代理實(shí)現(xiàn)過程詳解

 更新時(shí)間:2020年02月22日 10:43:14   作者:流氓大隊(duì)長  
這篇文章主要介紹了Spring JDK動(dòng)態(tài)代理實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Spring JDK動(dòng)態(tài)代理實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

1. 創(chuàng)建項(xiàng)目

在 MyEclipse 中創(chuàng)建一個(gè)名稱為 springDemo03 的 Web 項(xiàng)目,將 Spring 支持和依賴的 JAR 包復(fù)制到 Web 項(xiàng)目的 WEB-INF/lib 目錄中,并發(fā)布到類路徑下。

2. 創(chuàng)建接口 CustomerDao

在項(xiàng)目的 src 目錄下創(chuàng)建一個(gè)名為 com.mengma.dao 的包,在該包下創(chuàng)建一個(gè) CustomerDao 接口,編輯后如下所示。

package com.mengma.dao;

public interface CustomerDao {
  public void add(); // 添加

  public void update(); // 修改

  public void delete(); // 刪除

  public void find(); // 查詢
}

3. 創(chuàng)建實(shí)現(xiàn)類 CustomerDaoImpl

在 com.mengma.dao 包下創(chuàng)建 CustomerDao 接口的實(shí)現(xiàn)類 CustomerDaoImpl,并實(shí)現(xiàn)該接口中的所有方法,如下所示。

package com.mengma.dao;

public class CustomerDaoImpl implements CustomerDao {

  @Override
  public void add() {
    System.out.println("添加客戶...");
  }

  @Override
  public void update() {
    System.out.println("修改客戶...");
  }

  @Override
  public void delete() {
    System.out.println("刪除客戶...");
  }

  @Override
  public void find() {
    System.out.println("修改客戶...");
  }
}

4. 創(chuàng)建切面類 MyAspect

在 src 目錄下,創(chuàng)建一個(gè)名為 com.mengma.jdk 的包,在該包下創(chuàng)建一個(gè)切面類 MyAspect,編輯后如下所示。

package com.mengma.jdk;

public class MyAspect {
  public void myBefore() {
    System.out.println("方法執(zhí)行之前");
  }

  public void myAfter() {
    System.out.println("方法執(zhí)行之后");
  }
}

上述代碼中,在切面中定義了兩個(gè)增強(qiáng)的方法,分別為 myBefore() 方法和 myAfter() 方法,用于對(duì)目標(biāo)類(CustomerDaoImpl)進(jìn)行增強(qiáng)。

5. 創(chuàng)建代理類 MyBeanFactory

在 com.mengma.jdk 包下創(chuàng)建一個(gè)名為 MyBeanFactory 的類,在該類中使用 java.lang.reflect.Proxy 實(shí)現(xiàn) JDK 動(dòng)態(tài)代理,如下所示。

package com.mengma.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.mengma.dao.CustomerDao;
import com.mengma.dao.CustomerDaoImpl;

public class MyBeanFactory {

  public static CustomerDao getBean() {
    // 準(zhǔn)備目標(biāo)類
    final CustomerDao customerDao = new CustomerDaoImpl();
    // 創(chuàng)建切面類實(shí)例
    final MyAspect myAspect = new MyAspect();
    // 使用代理類,進(jìn)行增強(qiáng)
    return (CustomerDao) Proxy.newProxyInstance(
        MyBeanFactory.class.getClassLoader(),
        new Class[] { CustomerDao.class }, new InvocationHandler() {
          public Object invoke(Object proxy, Method method,
              Object[] args) throws Throwable {
            myAspect.myBefore(); // 前增強(qiáng)
            Object obj = method.invoke(customerDao, args);
            myAspect.myAfter(); // 后增強(qiáng)
            return obj;
          }
        });
  }
}

上述代碼中,定義了一個(gè)靜態(tài)的 getBean() 方法,這里模擬 Spring 框架的 IoC 思想,通過調(diào)用 getBean() 方法創(chuàng)建實(shí)例,第 14 行代碼創(chuàng)建了 customerDao 實(shí)例。

第 16 行代碼創(chuàng)建的切面類實(shí)例用于調(diào)用切面類中相應(yīng)的方法;第 18~26 行就是使用代理類對(duì)創(chuàng)建的實(shí)例 customerDao 中的方法進(jìn)行增強(qiáng)的代碼,其中 Proxy 的 newProxyInstance() 方法的第一個(gè)參數(shù)是當(dāng)前類的類加載器,第二參數(shù)是所創(chuàng)建實(shí)例的實(shí)現(xiàn)類的接口,第三個(gè)參數(shù)就是需要增強(qiáng)的方法。

在目標(biāo)類方法執(zhí)行的前后,分別執(zhí)行切面類中的 myBefore() 方法和 myAfter() 方法。

6. 創(chuàng)建測試類 JDKProxyTest

在 com.mengma.jdk 包下創(chuàng)建一個(gè)名為 JDKProxyTest 的測試類,如下所示。

package com.mengma.jdk;

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

public class JDKProxyTest {
  @Test
  public void test() {
    // 從工廠獲得指定的內(nèi)容(相當(dāng)于spring獲得,但此內(nèi)容時(shí)代理對(duì)象)
    CustomerDao customerDao = MyBeanFactory.getBean();
    // 執(zhí)行方法
    customerDao.add();
    customerDao.update();
    customerDao.delete();
    customerDao.find();
  }
}

上述代碼中,在調(diào)用 getBean() 方法時(shí),獲取的是 CustomerDao 類的代理對(duì)象,然后調(diào)用了該對(duì)象中的方法。

7. 運(yùn)行項(xiàng)目并查看結(jié)果

使用 JUnit 測試運(yùn)行 test() 方法,運(yùn)行成功后,控制臺(tái)的輸出結(jié)果如圖 1 所示。

從下圖的輸出結(jié)果中可以看出,在調(diào)用目標(biāo)類的方法前后,成功調(diào)用了增強(qiáng)的代碼,由此說明,JDK 動(dòng)態(tài)代理已經(jīng)實(shí)現(xiàn)。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java返回文件時(shí)為圖片或pdf等設(shè)置在線預(yù)覽或下載功能

    Java返回文件時(shí)為圖片或pdf等設(shè)置在線預(yù)覽或下載功能

    這篇文章主要介紹了Java返回文件時(shí)為圖片或pdf等設(shè)置在線預(yù)覽或下載功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • JavaWeb使用POI操作Excel文件實(shí)例

    JavaWeb使用POI操作Excel文件實(shí)例

    這篇文章主要介紹了JavaWeb使用POI操作Excel文件,需要的朋友可以參考下
    2017-04-04
  • Java中實(shí)現(xiàn)高清圖片壓縮的兩種方案(最新推薦)

    Java中實(shí)現(xiàn)高清圖片壓縮的兩種方案(最新推薦)

    文章首先介紹了Java中進(jìn)行高清圖片壓縮的基本方法,包括使用Java標(biāo)準(zhǔn)庫ImageIO和第三方庫ApacheCommonsCompress,通過示例代碼展示了如何調(diào)整圖像質(zhì)量和使用第三方工具來壓縮圖片文件,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Java多線程中Lock鎖的使用小結(jié)

    Java多線程中Lock鎖的使用小結(jié)

    這篇文章主要介紹了Java多線程中Lock鎖的使用小結(jié),本節(jié)主要講了它的基本使用,大家可以舉一反三,試試什么條件下會(huì)導(dǎo)致死鎖,需要的朋友可以參考下
    2022-06-06
  • SpringBoot整合Kaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能

    SpringBoot整合Kaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能

    這篇文章主要介紹了SpringBoot整合Kaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Mybatis加載策略的實(shí)現(xiàn)方法

    Mybatis加載策略的實(shí)現(xiàn)方法

    Mybatis中一對(duì)一,一對(duì)多,多對(duì)多關(guān)系的配置及實(shí)現(xiàn),可以實(shí)現(xiàn)對(duì)象的關(guān)聯(lián)查詢。實(shí)際開發(fā)過程中很多時(shí)候我們并不需要總是在加載用戶信息時(shí)就一定要加載他的訂單信息,這是就是我們常說的延時(shí)加載,本文給大家詳細(xì)介紹實(shí)現(xiàn)方法,一起看看吧
    2022-02-02
  • Spring Boot 中密碼加密的兩種方法

    Spring Boot 中密碼加密的兩種方法

    這篇文章主要介紹了Spring Boot 中密碼加密的兩種方法,幫助大家更好的理解和使用Spring Boot框架,感興趣的朋友可以了解下
    2020-09-09
  • SpringBoot返回所有接口詳細(xì)信息的方法詳解

    SpringBoot返回所有接口詳細(xì)信息的方法詳解

    這篇文章主要介紹了SpringBoot返回所有接口詳細(xì)信息的方法,簡單來說就是我們通過訪問一個(gè)接口能看到我們所有的API接口的數(shù)量,以及路徑和請(qǐng)求方法,文中有詳細(xì)的代碼供大家參考,需要的朋友可以參考下
    2025-04-04
  • 在IDEA中創(chuàng)建Web項(xiàng)目的詳細(xì)過程

    在IDEA中創(chuàng)建Web項(xiàng)目的詳細(xì)過程

    這篇文章主要給大家介紹了關(guān)于在IDEA中創(chuàng)建Web項(xiàng)目的詳細(xì)過程,很多朋友可能在學(xué)習(xí)java基礎(chǔ)的時(shí)候已經(jīng)熟練掌握了IDEA創(chuàng)建java項(xiàng)目的基本步驟,但隨著學(xué)習(xí)技術(shù)的不斷深入,不同的IDEA版本可能在項(xiàng)目的創(chuàng)建頁面上出現(xiàn)些許的出入,需要的朋友可以參考下
    2023-10-10
  • 解決?IDEA?Maven?項(xiàng)目中"Could?not?find?artifact"?問題的常見情況和解決方案

    解決?IDEA?Maven?項(xiàng)目中"Could?not?find?artifact"?

    這篇文章主要介紹了解決IDEA Maven項(xiàng)目中Could not?find?artifact問題的常見情況和解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

镇宁| 子洲县| 苏尼特右旗| 丰台区| 湘潭市| 塘沽区| 绥阳县| 宣威市| 武功县| 探索| 崇明县| 伊春市| 枞阳县| 台州市| 金坛市| 碌曲县| 奎屯市| 中卫市| 泸水县| 安福县| 靖州| 晋州市| 松溪县| 西乌珠穆沁旗| 宝兴县| 米泉市| 鹤壁市| 东至县| 女性| 临潭县| 陇西县| 西藏| 沁阳市| 锡林浩特市| 建昌县| 河源市| 苍山县| 平乡县| 西丰县| 黔江区| 横山县|