静态代理与动态代理

Source

1、什么是代理

为其他对象提供一种代理以控制对这个对象的访问。

其实就是有中间人帮你干了某些事情。
比如一般都是厂家委托给代理商进行销售,顾客直接和代理商进行打交道,不和产品实际产生关联。

2、为什么要用代理呢?

  • 代理模式可以将具体的实现与调用方法进行解耦,通过面向接口进行编码完全将具体的实现隐藏在内部。
  • 当我们需要在原代码的基础上添加业务时,不修改原代码,可以添加一个代理来在原来的方法上添加业务。

3、代理模式

代理模式为其他对象提供一种代理以控制对这个对象的访问。
我们这里代理类与真正的类的对象之间就是关联关系。
在这里插入图片描述
现在我们访问RealSubject都需要通过Proxy来访问到。由proxy来控制对RealSubject的访问。

4、静态代理与动态代理

4.1、静态代理

由程序员在编译的时候就将接口、实现类、代理类等全部手动完成,所以如果我们需要很多的代理类,那么就会特别浪费时间。
比如我们现在所有的方法都需要添加日志,在调用方法前后输入参数和方法返回结果,为了不修改原业务,我们使用代理类,我们难道要给所有需要加日志的类都写一个代理类吗?

静态代理例子:
在这里插入图片描述
proxy直接的方法直接调用gg对应的方法,然后客户端调用proxy。

4.2、动态代理

在程序运行期间根据需要动态的创建代理类及其实例,来完成具体的功能。

动态代理的作用:
在业务代理中使用动态代理,一般是因为要给实现的方法添加预处理或者添加后续处理操作,但是又不干预实现类的正常业务,所以把基本业务和主要的业务逻辑分离。

AOP就是基于动态代理实现的。

动态代理一般有两种类型:一种是基于JDK的动态代理,一种是基于CGLIB的动态代理。