欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

1. 創(chuàng)建項目

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

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

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

package com.mengma.dao;

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

  public void update(); // 修改

  public void delete(); // 刪除

  public void find(); // 查詢
}

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

在 com.mengma.dao 包下創(chuàng)建 CustomerDao 接口的實現(xiàn)類 CustomerDaoImpl,并實現(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)建一個名為 com.mengma.jdk 的包,在該包下創(chuàng)建一個切面類 MyAspect,編輯后如下所示。

package com.mengma.jdk;

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

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

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

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

在 com.mengma.jdk 包下創(chuàng)建一個名為 MyBeanFactory 的類,在該類中使用 java.lang.reflect.Proxy 實現(xiàn) JDK 動態(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)建切面類實例
    final MyAspect myAspect = new MyAspect();
    // 使用代理類,進行增強
    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(); // 前增強
            Object obj = method.invoke(customerDao, args);
            myAspect.myAfter(); // 后增強
            return obj;
          }
        });
  }
}

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

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

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

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

在 com.mengma.jdk 包下創(chuàng)建一個名為 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)容時代理對象)
    CustomerDao customerDao = MyBeanFactory.getBean();
    // 執(zhí)行方法
    customerDao.add();
    customerDao.update();
    customerDao.delete();
    customerDao.find();
  }
}

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

7. 運行項目并查看結(jié)果

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

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

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

相關(guān)文章

  • java中正則表達式實例詳解

    java中正則表達式實例詳解

    這篇文章主要介紹了java中正則表達式實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java pdu短信解碼全面解析

    Java pdu短信解碼全面解析

    本文是根據(jù)python的方法改寫的pdu短信解碼,非常不錯,代碼簡單易懂具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-10-10
  • @Controller、@RestController注解區(qū)別詳解

    @Controller、@RestController注解區(qū)別詳解

    這篇文章主要介紹了@Controller、@RestController注解區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • java文件上傳Demo(必看篇)

    java文件上傳Demo(必看篇)

    下面小編就為大家?guī)硪黄猨ava文件上傳Demo(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java實現(xiàn)鏈表中元素的獲取、查詢和修改方法詳解

    Java實現(xiàn)鏈表中元素的獲取、查詢和修改方法詳解

    這篇文章主要介紹了Java實現(xiàn)鏈表中元素的獲取、查詢和修改方法,結(jié)合實例形式詳細(xì)分析了Java針對鏈表中元素的獲取、查詢和修改相關(guān)原理、實現(xiàn)方法及操作注意事項,需要的朋友可以參考下
    2020-03-03
  • 詳解使用SSM實現(xiàn)簡單工作流系統(tǒng)之實現(xiàn)篇

    詳解使用SSM實現(xiàn)簡單工作流系統(tǒng)之實現(xiàn)篇

    這篇文章主要介紹了使用SSM實現(xiàn)簡單工作流系統(tǒng)之實現(xiàn)篇,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java?@Scheduled定時任務(wù)不執(zhí)行解決辦法

    Java?@Scheduled定時任務(wù)不執(zhí)行解決辦法

    這篇文章主要給大家介紹了關(guān)于Java?@Scheduled定時任務(wù)不執(zhí)行解決的相關(guān)資料,當(dāng)@Scheduled定時任務(wù)不執(zhí)行時可以根據(jù)以下步驟進行排查和解決,需要的朋友可以參考下
    2023-10-10
  • java?System類和Arrays類詳解

    java?System類和Arrays類詳解

    這篇文章主要介紹了java?System類和Arrays類詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Java8新特性stream和parallelStream區(qū)別

    Java8新特性stream和parallelStream區(qū)別

    這篇文章主要介紹了Java8新特性stream和parallelStream區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 詳解SpringBoot集成Redis來實現(xiàn)緩存技術(shù)方案

    詳解SpringBoot集成Redis來實現(xiàn)緩存技術(shù)方案

    本篇文章主要介紹了詳解SpringBoot集成Redis來實現(xiàn)緩存技術(shù)方案,具有一定的參考價值,有興趣的可以了解一下
    2017-06-06

最新評論