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

java實現(xiàn)動態(tài)代理方法淺析

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

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

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

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

接口:

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

實現(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動態(tài)代理的實現(xiàn)有2種方式

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

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

InvocationHandler介紹:

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

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

Proxy介紹:

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

實例(模擬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;
  }

}

測試代碼:

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();
  }

}

測試結(jié)果:

start Transaction
add user
end Transaction

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

2. 第三方庫cglib

CGLIB是一個功能強大的,高性能、高質(zhì)量的代碼生成庫,用于在運行期擴展Java類和實現(xiàn)Java接口。

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

JDK動態(tài)代理是針對接口的,而cglib是針對類來實現(xiàn)代理的,cglib的原理是對指定的目標類生成一個子類,并覆蓋其中方法實現(xiàn)增強,但因為采用的是繼承,所以不能對final修飾的類進行代理。

實例代碼如下:

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;
  }

}

測試代碼:

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();
  }

}

測試結(jié)果:

start Transaction by cglib
add user
end Transaction by cglib

感興趣的讀者可以實際測試一下本文實例,相信會有很大的收獲。

相關(guān)文章

  • IDEA創(chuàng)建自定義模板圖文教程

    IDEA創(chuàng)建自定義模板圖文教程

    我們每次在使用IntelliJ IDEA 時總會有一些文件是一直被創(chuàng)建的,今天我們就來學習一下IntelliJ IDEA 的自定義模板功能,文中有詳細的圖文介紹,需要的朋友可以參考下
    2021-05-05
  • java編寫簡易貪吃蛇游戲

    java編寫簡易貪吃蛇游戲

    這篇文章主要為大家詳細介紹了java編寫簡易貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 基于Java注解(Annotation)的自定義注解入門介紹

    基于Java注解(Annotation)的自定義注解入門介紹

    要深入學習注解,我們就必須能定義自己的注解,并使用注解,在定義自己的注解之前,我們就必須要了解Java為我們提供的元注解和相關(guān)定義注解的語法
    2013-04-04
  • Java面試最容易被刷的重難點之鎖的使用策略

    Java面試最容易被刷的重難點之鎖的使用策略

    鎖像synchronized同步塊一樣,是一種線程同步機制,但比Java中的synchronized同步塊更復(fù)雜。因為鎖(以及其它更高級的線程同步機制)是由synchronized同步塊的方式實現(xiàn)的,所以我們還不能完全擺脫synchronized關(guān)鍵字
    2021-10-10
  • Mybatis-plus自動填充不生效或自動填充數(shù)據(jù)為null原因及解決方案

    Mybatis-plus自動填充不生效或自動填充數(shù)據(jù)為null原因及解決方案

    本文主要介紹了Mybatis-plus自動填充不生效或自動填充數(shù)據(jù)為null原因及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • jxls2.4.5如何動態(tài)導(dǎo)出excel表頭與數(shù)據(jù)

    jxls2.4.5如何動態(tài)導(dǎo)出excel表頭與數(shù)據(jù)

    這篇文章主要介紹了jxls2.4.5如何動態(tài)導(dǎo)出excel表頭與數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java concurrency之AtomicReference原子類_動力節(jié)點Java學院整理

    Java concurrency之AtomicReference原子類_動力節(jié)點Java學院整理

    AtomicReference是作用是對"對象"進行原子操作。這篇文章主要介紹了Java concurrency之AtomicReference原子類,需要的朋友可以參考下
    2017-06-06
  • Java代碼實現(xiàn)隨機生成漢字的方法

    Java代碼實現(xiàn)隨機生成漢字的方法

    今天小編就為大家分享一篇關(guān)于Java代碼實現(xiàn)隨機生成漢字的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • java多線程之Future和FutureTask使用實例

    java多線程之Future和FutureTask使用實例

    這篇文章主要介紹了java多線程之Future和FutureTask使用實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 用Java實現(xiàn)簡單計算器功能

    用Java實現(xiàn)簡單計算器功能

    這篇文章主要為大家詳細介紹了用Java實現(xiàn)簡單計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論

通州市| 麻阳| 卫辉市| 阿巴嘎旗| 洞头县| 德清县| 福清市| 通山县| 秀山| 河南省| 辽源市| 望城县| 郧西县| 启东市| 浦县| 庄河市| 中卫市| 武乡县| 双辽市| 积石山| 陇西县| 桑植县| 汉寿县| 德化县| 高台县| 宁晋县| 乐业县| 偏关县| 南雄市| 吕梁市| 清流县| 海原县| 九龙坡区| 佛冈县| 宿州市| 来凤县| 寻甸| 漳平市| 拉萨市| 琼海市| 六盘水市|