静态代理:

Demo

UserService

UserService接口

UserClinet 需要被代理的对象

需要被代理的对象实现了UserService接口

Porxy 代理类

代理Clint并增强方法

测试Demo

测试Demo

运行结果:

运行结果

缺点总结:

  1. 当需要代理 多个类时,由于代理对象要实现与代理对象一致的接口,有两种方式:
    • 只为维护一个代理类,但是代理类要实现多个接口,这样就导致代理类过于庞大
    • 新建多个代理类,每个代理对象 对应 一个代理类,这样就会产生过多的代理类
  2. 当接口需要增加,删除,修改方法的时候,代理对象和代理类都要同时修改,不易维护

动态代理

JDK动态代理

  1. 创建自定义的Handler,需要实现 InvocationHandler 这个接口

Handler

  1. 测试, 调用 java.lang.reflect中的 Proxy 中的 newProxyInstance 方法,需要代理类的 ClassLoader ,父类的所有 Interface ,和自己定义的 Handler。

测试Demo

  1. 运行结果

运行结果

CGLIB动态代理

  1. 创建目标类 TargetClass

    TargetClass.class

  2. 实现自定义的 Handler (Intercepter)

MyIntercepter.clas

  1. 使用 Enhancer ,传递目标对象,设置Handler ,用Enhancer创 目标类子类 的代理

测试Demo

  1. 运行结果

运行结果

总结:

JDK :

​ 缺点: 只能代理接口,因为代理类本身已经 extends 了 Proxy ,而 java 不允许多继承,但允许实现多个接口。

Cglib:

​ 优点: 没有接口也可以实现动态代理,而且采用字节码增强技术,性能也不错