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

java實(shí)現(xiàn)動(dòng)態(tài)代理方法淺析

 更新時(shí)間:2014年08月18日 12:00:29   投稿:shichen2014  
這篇文章主要介紹了java實(shí)現(xiàn)動(dòng)態(tài)代理方法淺析,很實(shí)用的功能,需要的朋友可以參考下

一些Java項(xiàng)目中在mybatis與spring整合中有MapperScannerConfigurer的使用,該類通過反向代理自動(dòng)生成基于接口的動(dòng)態(tài)代理類。

有鑒于此,本文淺析了java的動(dòng)態(tài)代理。

本文使用動(dòng)態(tài)代理模擬處理事務(wù)的攔截器。

接口:

public interface UserService {
  public void addUser();
  public void removeUser();
  public void searchUser();
}

實(shí)現(xiàn)類:

public class UserServiceImpl implements UserService {
  public void addUser() {
    System.out.println("add user");
  }
  public void removeUser() {
    System.out.println("remove user");
  }
  public void searchUser() {
    System.out.println("search user");
  }
}

java動(dòng)態(tài)代理的實(shí)現(xiàn)有2種方式

1.jdk自帶的動(dòng)態(tài)代理

使用jdk自帶的動(dòng)態(tài)代理需要了解InvocationHandler接口和Proxy類,他們都是在java.lang.reflect包下。

InvocationHandler介紹:

InvocationHandler是代理實(shí)例的調(diào)用處理程序?qū)崿F(xiàn)的接口。

每個(gè)代理實(shí)例都具有一個(gè)關(guān)聯(lián)的InvocationHandler。對(duì)代理實(shí)例調(diào)用方法時(shí),這個(gè)方法會(huì)調(diào)用InvocationHandler的invoke方法。

Proxy介紹:

Proxy 提供靜態(tài)方法用于創(chuàng)建動(dòng)態(tài)代理類和實(shí)例。

實(shí)例(模擬AOP處理事務(wù)):

public class TransactionInterceptor implements InvocationHandler {

  private Object target;

  public void setTarget(Object target) {
    this.target = target;
  }
  
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("start Transaction");
    method.invoke(target, args);
    System.out.println("end Transaction");
    return null;
  }

}

測(cè)試代碼:

public class TestDynamicProxy {

  @Test
  public void testJDK() {
    TransactionInterceptor transactionInterceptor = new TransactionInterceptor();
    UserService userService = new UserServiceImpl();
    transactionInterceptor.setTarget(userService);
    UserService userServiceProxy =
        (UserService) Proxy.newProxyInstance(
            userService.getClass().getClassLoader(),
            userService.getClass().getInterfaces(),
            transactionInterceptor);
    userServiceProxy.addUser();
  }

}

測(cè)試結(jié)果:

start Transaction
add user
end Transaction

很明顯,我們通過userServiceProxy這個(gè)代理類進(jìn)行方法調(diào)用的時(shí)候,會(huì)在方法調(diào)用前后進(jìn)行事務(wù)的開啟和關(guān)閉。

2. 第三方庫(kù)cglib

CGLIB是一個(gè)功能強(qiáng)大的,高性能、高質(zhì)量的代碼生成庫(kù),用于在運(yùn)行期擴(kuò)展Java類和實(shí)現(xiàn)Java接口。

它與JDK的動(dòng)態(tài)代理的之間最大的區(qū)別就是:

JDK動(dòng)態(tài)代理是針對(duì)接口的,而cglib是針對(duì)類來實(shí)現(xiàn)代理的,cglib的原理是對(duì)指定的目標(biāo)類生成一個(gè)子類,并覆蓋其中方法實(shí)現(xiàn)增強(qiáng),但因?yàn)椴捎玫氖抢^承,所以不能對(duì)final修飾的類進(jìn)行代理。

實(shí)例代碼如下:

public class UserServiceCallBack implements MethodInterceptor {

  @Override
  public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    System.out.println("start Transaction by cglib");
    methodProxy.invokeSuper(o, args);
    System.out.println("end Transaction by cglib");
    return null;
  }

}

測(cè)試代碼:

public class TestDynamicProxy {

  @Test
  public void testCGLIB() {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(UserServiceImpl.class);
    enhancer.setCallback(new UserServiceCallBack());
    UserServiceImpl proxy = (UserServiceImpl)enhancer.create();
    proxy.addUser();
  }

}

測(cè)試結(jié)果:

start Transaction by cglib
add user
end Transaction by cglib

感興趣的讀者可以實(shí)際測(cè)試一下本文實(shí)例,相信會(huì)有很大的收獲。

相關(guān)文章

  • springboot中PostMapping正常接收json參數(shù)后返回404問題

    springboot中PostMapping正常接收json參數(shù)后返回404問題

    這篇文章主要介紹了springboot中PostMapping正常接收json參數(shù)后返回404問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java實(shí)現(xiàn)一鍵獲取Mysql所有表字段設(shè)計(jì)和建表語(yǔ)句的工具類

    Java實(shí)現(xiàn)一鍵獲取Mysql所有表字段設(shè)計(jì)和建表語(yǔ)句的工具類

    這篇文章主要為大家詳細(xì)介紹了如何利用Java編寫一個(gè)工具類,可以實(shí)現(xiàn)一鍵獲取Mysql所有表字段設(shè)計(jì)和建表語(yǔ)句,感興趣的小伙伴可以了解一下
    2023-05-05
  • 30條Java代碼編寫經(jīng)驗(yàn)分享

    30條Java代碼編寫經(jīng)驗(yàn)分享

    你知道寫好Java代碼的30條經(jīng)驗(yàn)是什么嗎?這篇文章主要為大家分享了30條Java代碼編寫經(jīng)驗(yàn)技巧,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 基于Java編寫第一個(gè)區(qū)塊鏈項(xiàng)目

    基于Java編寫第一個(gè)區(qū)塊鏈項(xiàng)目

    區(qū)塊鏈?zhǔn)欠植际綌?shù)據(jù)存儲(chǔ)、點(diǎn)對(duì)點(diǎn)傳輸、共識(shí)機(jī)制、加密算法等計(jì)算機(jī)技術(shù)的新型應(yīng)用模式,下面這篇文章主要給大家介紹了基于Java實(shí)現(xiàn)區(qū)塊鏈的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Spring AOP入門Demo分享

    Spring AOP入門Demo分享

    這篇文章主要介紹了Spring AOP入門Demo分享,涉及創(chuàng)建maven項(xiàng)目,編寫切面類,通過bean配置關(guān)聯(lián)等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 如何通過Kaptcha在Web頁(yè)面生成驗(yàn)證碼

    如何通過Kaptcha在Web頁(yè)面生成驗(yàn)證碼

    這篇文章主要介紹了如何通過Kaptcha在Web頁(yè)面生成驗(yàn)證碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java中自增和自減操作符(++/--)的那些事

    Java中自增和自減操作符(++/--)的那些事

    這篇文章主要給大家介紹了關(guān)于Java中自增和自減操作符(++/--)的那些事,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Spring Boot編寫攔截器教程實(shí)例解析

    Spring Boot編寫攔截器教程實(shí)例解析

    這篇文章主要介紹了Spring Boot編寫攔截器教程實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java計(jì)算Date類時(shí)間差實(shí)例代碼演示

    Java計(jì)算Date類時(shí)間差實(shí)例代碼演示

    最近工作中遇到需要計(jì)算時(shí)間差,這里給大家總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于Java計(jì)算Date類時(shí)間差的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Java中synchronized鎖的深入理解

    Java中synchronized鎖的深入理解

    這篇本文主要對(duì)Java中synchronized鎖進(jìn)行深入理解,文中通過synchronized的優(yōu)化,synchronized的實(shí)現(xiàn)原理及synchronized的升級(jí)過程來介紹Java中synchronized鎖,感興趣的同學(xué)可以跟著小編一起來學(xué)習(xí)
    2023-05-05

最新評(píng)論