java代理

静态代理

代理简单的说,就是一个对象想实现某一件事情,但是却要通过代理对象来完成这件事情。这个对象与这件事之间不直接联系,代理对象起到了一个中介的作用。

代理的好处

  • ocp(开闭原则)
  • 能拓展功能,而不侵入原代码。

静态代理的缺点

  • 当拓展功能很多时,会导致代理对象的膨胀,且膨胀是无意义的。

动态代理

由于静态代理的不灵活和代码的膨胀,我们需要在运行期间动态的来产生代理对象。

动态代理能拓展功能,而不侵入代码,可以可以减少编写代码的工作量,系统拓展性和维护性好。

动态代理使用总结(四步走)

  1. 通过实现InvacationHandler接口实现自己的动态代理处理器。
  2. 在自己的动态代理处理器中重写invoke方法,里面写原业务和拓展业务的代码。
  3. 通过反射加载动态代理处理器,通过反射获得接口。
  4. 将处理器对象传入Proxy类的getInstance方法中。

动态代理的缺点

  • 代理类必须实现一个接口(个人认为是动态代理最大的缺点,无法摆脱对接口的桎梏)。
  • 由于使用了反射机制,导致速度相对较慢。

拓展

spring的aop实现有两种,一种是jdk的动态代理(通过jdk的提供的InvocationHandler和Proxy 实现),另一种是cglib的动态代理(通过修改字节码实现代理)