激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - java實現動態代理方法淺析

java實現動態代理方法淺析

2019-11-26 15:17shichen2014 JAVA教程

這篇文章主要介紹了java實現動態代理方法淺析,很實用的功能,需要的朋友可以參考下

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

有鑒于此,本文淺析了java的動態代理。

本文使用動態代理模擬處理事務的攔截器。

接口:

?
1
2
3
4
5
public interface UserService {
  public void addUser();
  public void removeUser();
  public void searchUser();
}

實現類:

?
1
2
3
4
5
6
7
8
9
10
11
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動態代理的實現有2種方式

1.jdk自帶的動態代理

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

InvocationHandler介紹:

InvocationHandler是代理實例的調用處理程序實現的接口。

每個代理實例都具有一個關聯的InvocationHandler。對代理實例調用方法時,這個方法會調用InvocationHandler的invoke方法。

Proxy介紹:

Proxy 提供靜態方法用于創建動態代理類和實例。

實例(模擬AOP處理事務):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
  }
 
}

測試代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();
  }
 
}

測試結果:

?
1
2
3
start Transaction
add user
end Transaction

很明顯,我們通過userServiceProxy這個代理類進行方法調用的時候,會在方法調用前后進行事務的開啟和關閉。

2. 第三方庫cglib

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

它與JDK的動態代理的之間最大的區別就是:

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

實例代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
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;
  }
 
}

測試代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
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();
  }
 
}

測試結果:

?
1
2
3
start Transaction by cglib
add user
end Transaction by cglib

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

延伸 · 閱讀

精彩推薦
298
主站蜘蛛池模板: 午夜视频久久 | 久久久久久三区 | 久久国语对白 | av在线观| 青草久久久久 | 在线播放的av网站 | 亚洲一区在线观看视频 | 久久精品一区视频 | 污片在线观看视频 | 国产亚洲精品美女久久久 | 亚洲视频综合网 | 一级大黄毛片免费观看 | 91av在线免费视频 | 成人颜色视频 | 999久久久国产999久久久 | 免费视频www在线观看 | 精品中文字幕视频 | 精品一区二区三区毛片 | 欧美一级xxx | 美女wc| 国产91极品| 欧美成人综合视频 | 在线亚洲欧美日韩 | 欧美一级视屏 | 黄色成人在线播放 | 成人在线免费小视频 | 在线观看中文字幕国产 | 伊人999| v片在线看| 欧美成人三级视频 | av懂色 | 久久精品国产99国产精品亚洲 | 久久久资源网 | 久久久久久久久久91 | 国产一区二区三区高清 | 日韩三级伦理在线观看 | 黄色免费在线电影 | 一道本不卡一区 | 免费视频www在线观看 | 羞羞的小视频 | 久久精品中文字幕 |