一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

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

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - java實(shí)現(xiàn)動(dòng)態(tài)代理方法淺析

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

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

這篇文章主要介紹了java實(shí)現(xiàn)動(dòng)態(tài)代理方法淺析,很實(shí)用的功能,需要的朋友可以參考下

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

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

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

接口:

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

實(shí)現(xiàn)類(lèi):

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

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

使用jdk自帶的動(dòng)態(tài)代理需要了解InvocationHandler接口和Proxy類(lèi),他們都是在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)代理類(lèi)和實(shí)例。

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

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

測(cè)試代碼:

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

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

?
1
2
3
start Transaction
add user
end Transaction

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

2. 第三方庫(kù)cglib

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

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

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

實(shí)例代碼如下:

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

測(cè)試代碼:

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

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人cao在线 | 穆挂英风流艳史小说 | 欧美福利在线播放 | ady成人映画网站官网 | 亚洲欧美日韩另类在线一 | 强制高h| 亚洲国产日韩制服在线观看 | www.麻豆视频 | 亚洲va欧美va国产综合久久 | 日韩欧美亚洲每日更新网 | 四虎成人www国产精品 | 久久国产综合精品欧美 | 成人免费在线视频观看 | 亚洲国产精品二区久久 | 无码人妻少妇色欲AV一区二区 | 国产精品免费视频能看 | 国产精品久久久久久久人人看 | 91粉色视频在线导航 | 日韩妹妹| 暖暖在线日本 | 1717国产精品视频免费 | 99久久香蕉国产综合影院 | 亚洲视频一区二区在线观看 | 日本道色综合久久影院 | 久久sese| 无遮挡免费h肉动漫在线观看 | 好男人影视社区www在线观看 | 欧美色图亚洲 | 亚洲精品国偷拍自产在线观看蜜臀 | 猛h辣h高h文湿校园1v1 | 久草在线福利资站免费视频 | 被18号每天强行榨干acg | 国产精品欧美亚洲韩国日本99 | 日本欧美大码a在线视频播放 | 日韩国产欧美一区二区三区 | 欧洲vodafone精品性 | caonila国产在线观看 | 日日干影院 | 日本无遮挡拍拍拍凤凰 | 国产欧美精品一区二区三区四区 | 成年男女免费大片在线观看 |