成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java實現代理模式的三種方式

開發 前端
代理模式是項目中常用的一種設計模式。提供了間接訪問目標對象的一種方式;即通過代理對象訪問目標對象。這樣做的好處是,可以在不改變原有目標對象的基礎上,對目標對象增加額外的擴展功能。

什么是代理模式

代理模式是項目中常用的一種設計模式。提供了間接訪問目標對象的一種方式;即通過代理對象訪問目標對象。

這樣做的好處是,可以在不改變原有目標對象的基礎上,對目標對象增加額外的擴展功能。

代理模式又分為靜態代理、jdk動態代理、cglib動態代理三種實現方式。

三種實現方式各有優點,以及適用的場景。

一、靜態代理

被代理對象與代理對象需要實現相同的接口或者是繼承相同父類,因此要定義一個接口或抽象類。

/**代理接口*/
public interface IHello {
String hi(String key);
}
/**代理接口實現類*/
public class HelloImpl implements IHello {
@Override
public String hi(String key) {
String str = "hello:" + key;
System.out.println("HelloImpl! " + str);
return str;
}
}
/**靜態代理類*/
public class HelloStaticProxy implements IHello {

private IHello hello;

public HelloStaticProxy(IHello hello) {
this.hello = hello;
}

@Override
public String hi(String key) {
System.out.println(">>> static proxy start");
String result = hello.hi(key);
System.out.println(">>> static proxy end");
return result;
}
}
/**測試*/
public class DemoTest {

public static void main(String[] args) {
IHello helloProxy = new HelloStaticProxy(new HelloImpl());
helloProxy.hi("world");
}
}

輸出結果:

>>> static proxy start
HelloImpl! hello:world
>>> static proxy end

二、jdk動態代理

jdk動態代理是基于接口的一種代理方式,目標對象一定要實現接口。

原理是,利用反射機制,動態生成匿名類繼承Proxy類并且實現了要代理的接口,由于java不支持多繼承,所以JDK動態代理不能代理類。

/**代理接口*/
public interface IHello {
String hi(String key);
}
/**代理接口實現類*/
public class HelloImpl implements IHello {
@Override
public String hi(String key) {
String str = "hello:" + key;
System.out.println("HelloImpl! " + str);
return str;
}
}


/**jdk動態代理類*/
public class JdkProxy implements InvocationHandler {

private Object target;

public JdkProxy(Object target) {
this.target = target;
}

/**
* 獲取被代理接口實例對象
*
* @param <T>
* @return
*/
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(">>> JdkProxy start");
Object result = method.invoke(target, args);
System.out.println(">>> JdkProxy end");
return result;
}
}

/**測試*/
public class Demo2Test {

public static void main(String[] args) {
JdkProxy proxy = new JdkProxy(new HelloImpl());
IHello helloProxy = proxy.getProxy();
helloProxy.hi(" jdk proxy !");
}
}

輸出結果:

>>> JdkProxy start
HelloImpl! hello: jdk proxy !
>>> JdkProxy end

三、cglib動態代理

目標對象可以不用實現接口,不能針對final類進行代理。

原理是,動態生成class繼承目標對象。

使用cglib必須引入對應的jar包。

 <dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.7</version>
</dependency>
/**目標類*/
public class HelloImpl {
public String hi(String key) {
String str = "hello:" + key;
System.out.println("HelloImpl! " + str);
return str;
}
}

/**cglib代理類*/
public class CglibProxy implements InvocationHandler {

private Object target;

/**
* 獲取被代理接口實例對象
*/
public <T> T getProxy() {
//1創建增強器對象
Enhancer e = new Enhancer();
//2設置增強器的類加載器
e.setClassLoader(target.getClass().getClassLoader());
//3設置代理對象父類類型
e.setSuperclass(target.getClass());
//4設置回調函數
e.setCallback(this);
//5創建代理對象
return (T) e.create();
}

public CglibProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(">>> cglib start");
Object obj = method.invoke(target, args);
System.out.println(">>> cglib end");
return obj;
}
}

/**測試*/
public class Demo3Test {

public static void main(String[] args) {
HelloImpl hello = new HelloImpl();
CglibProxy cglibProxy = new CglibProxy(hello);
HelloImpl proxy = cglibProxy.getProxy();
proxy.hi(" cglib ");
}
}

輸出結果:

>>> cglib start
HelloImpl! hello: cglib
>>> cglib end

四、總結

靜態代理,代理類必須非常明確,所以無法做到通用,但是效率也是最高的。

jdk動態代理,必須基于接口代理,有一定局限性;動態生成字節碼文件,可以用于通用業務(性能日志等)。

cglig動態代理,也是動態生成字節碼文件,生成的代理類繼承了目標對象。

spring aop默認代理策略是:如果目標對象實現了接口,則使用jdk動態代理,否則使用cglib代理。

jdk8之后,jdk動態代理效率要高于cglib代理?。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2018-04-02 14:29:18

Java多線程方式

2010-03-12 17:52:35

Python輸入方式

2021-11-05 21:33:28

Redis數據高并發

2014-12-31 17:42:47

LBSAndroid地圖

2021-06-24 08:52:19

單點登錄代碼前端

2025-06-06 00:00:00

JavaHTTPMCP

2024-07-01 12:42:58

2023-12-04 09:31:13

CSS卡片

2012-07-17 09:16:16

SpringSSH

2022-01-17 08:19:51

Javascript 接口前端

2024-07-08 09:03:31

2015-09-14 09:31:44

結對設計

2022-01-20 08:38:02

Java接口Lambda

2010-09-07 16:31:27

CSS

2022-06-06 13:41:27

區塊鏈商業活動數字技術

2024-08-13 08:25:16

C#外部程序方式

2020-11-01 17:10:46

異步事件開發前端

2024-05-27 00:20:00

2022-05-27 11:33:02

前端代碼設計模式

2019-11-20 18:52:24

物聯網智能照明智能恒溫器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 7777精品伊人久久精品影视 | 欧美久久一区二区 | 天天干天天干 | 亚洲久视频 | 亚洲视频精品 | 婷婷午夜天 | 亚洲 精品 综合 精品 自拍 | 中文字幕在线三区 | 午夜精品久久久久久久星辰影院 | 亚洲成人一区二区三区 | 视频一区二区三区中文字幕 | 91在线一区| 成年人在线观看视频 | 男女下面一进一出网站 | 久久精品一区二区视频 | 九九久久精品 | 久久精品91久久久久久再现 | 日韩成人一区 | 国产精品精品 | 日本精品一区二区三区四区 | 日日射影院 | 国产精品一区二区久久久久 | 久久久久国产精品一区二区 | 日韩视频精品在线 | 色网站入口 | 成人高清在线 | 91精品国产91久久综合桃花 | 一级做a爰片性色毛片视频停止 | 色综合一区二区 | 免费毛片网站 | 免费av电影网站 | 欧美黄在线观看 | 久久精品国产一区二区电影 | 国产免费视频 | 国产成人午夜高潮毛片 | 国产日韩在线观看一区 | 国产一区二区在线免费观看 | 欧美乱大交xxxxx另类电影 | 久久电影一区 | 亚洲第一网站 | 国产农村妇女精品一区 |