Proxy - 代理模式

Proxy-代理模式

why

5b2badcf26d4a34d87fbc7b891db364669c2b183

主要角色

01f34c274e62e4292bbc5f184f14a1635e770791

eg 14d67d85f7053bb9839fd03a9c0ec37cffe4a773

JDK动态代理

(有接口的情况下)

基于反射实现

代理类实现了目标接口

代理类

将我们提供的匿名内部类

形参传递给了父类

(用InterceptorHandler

接口接收的)

这个动态代理Proxy类, 提供了一个静态方法newProxyInstance来获取代理对象

b52ae2fe23d5956f04a84b1df57c6b9a5cf7a931

JDK 动态代理本质上生成的是一个“实现了你给定接口的类”

这个代理类既是给定接口的实现类, 也返回一个实现指定接口的实现类对象

482ca92052709a2c8e0872b707c227753ad23729

主要流程:

1.用目标接口接收proxy.newProxyInstance(...)返回的实现类(也是代理类)

2.内部

1
2
<p>a.生成代理类字节码--&gt;(既继承proxy,又实现目标接口,并且将(...)的method重写)</p>
<p>b.加载代理类 --&gt;(用(...)的指定接口的类加载器加载)</p>

c.调用代理类构造器 以创建代理类对象

dea85409b71362575e68d301b0c0c80d803391bc

于是这个$Proxy就有了InvocationHandler, 并且能够执行(...)传递的重写的invoke方法

215613dce7918d712717cc0262b3db32404190f5

流程总结:

f5c0cefe037ca379dd9ebcd4a3b1316a8e30952f

CGLIB 动态代理

(没有接口的情况下)

基于继承实现动态代理

因此

其提供的代理对象

是目标类的子类(需要set)

代理类还要实现methodInterceptor接口,

重写interceptor方法

bda66dda80f122779ccab2b1eb1f998cfa02bf95

jdk和cglib对比

95c5e6273c7edc276507aebf679a809d488aaa7f

d6f9a61ceeb9231394ba17c72a60fe323036ea78

JDK 动态代理基于接口;CGLIB 基于继承。

26486723d498209d321e6894b65f10672b58c80f

动态代理vs静态代理 f45af2d8f8557bd33baf46a44118c89063e4eebf
代理模式的优缺点 优点: 1.拓展目标对象的功能 2.中介保护目标对象 3.降低了客户端和目标对象的耦合度
缺点: 增加系统复杂度
使用场景

1c287dc92b9f906c255ef0353af79b50e3223cfb

还有防火墙代理

4d00c0431e56f10a10271d4369a918b132a6af08