代理模式是指,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,
一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户类和目标对象之
间起到中介的作用。

换句话说, 使用代理对象,是为了在不修改目标对象的基础上, 增强主业务逻辑。
客户类真正的想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象。
image.png

代理模式的作用

  1. 功能增强:在原有的功能上,额外增加了新的功能,叫做功能增强
  2. 控制访问:代理类使得用户不直接访问目标

代理模式分类

  1. 静态代理

    静态代理是指,代理类在程序运行前就已经定义好.java 源文件,其与目标类的关系在程序运行前就已经确立。 在程序运行前代理类已经编译为.class 文件。 特点:

    1. 实现简单
    2. 容易理解

    缺点:

    1. 目标增加的时候,代理类可能成倍增加
    2. 接口功能增加了,会影响很多实现类
  2. 动态代理

    动态代理是指代理类对象在程序运行时由 JVM 根据反射机制动态生成的。 动态代理不需要定义代理类的.java 源文件。 特点: 即使目标类很多,但是

    1. 代理类数量可以很少
    2. 修改接口中的方法,不会影响代理类

动态代理的实现方式

  1. JDK动态代理(理解):使用java反射包中的类和接口实现动态代理

    java.lang.reflect, 三个类: InvocationHandler, Method, Proxy. 代理的时候要求目标类必须有接口

  2. CGLIB动态代理(了解): 第三方的工具库,创建代理对象

    原理是继承,cglib通过继承目标类,创建其子类,在子类中重写父类中同名的方法,实现功能的修改. 要求目标类比较宽松,只要不是final 的,可以继承可以了.在mybatis 和 spring中都有使用. 目标类没有接口的时候就使用cglib实现了.