Proxy - 代理模式

Proxy-代理模式

why

image1

主要角色

image2

eg image3

JDK动态代理

(有接口的情况下)

基于反射实现

代理类实现了目标接口

代理类

将我们提供的匿名内部类

形参传递给了父类

(用InterceptorHandler

接口接收的)

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

image4

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

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

主要流程:

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

2.内部

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

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

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

流程总结:

CGLIB 动态代理

(没有接口的情况下)

基于继承实现动态代理

因此

其提供的代理对象

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

代理类还要实现methodInterceptor接口,

重写interceptor方法

image9

jdk和cglib对比

image10

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

image12

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

image14

还有防火墙代理