代理模式

代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。

代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象。

按照代理的创建时期,代理类可以分为两种。

1、静态代理

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。

  1. 可以做到在不修改目标对象的功能前提下,对目标功能扩展。
  2. 缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多。同时,一旦接口增加方法,目标对象与代理对象都要维护。

2、动态代理:

在程序运行时,运用反射机制动态创建而成。

实现动态代理的几个步骤:

  1. 实现InvocationHandler
  2. 获得动态代理类,这一步又涉及到运行时代理类字节码的生成和类加载
  3. 通过反射机制(getConstructor(InvocationHandler.class))获取代理类的实例并返回该对象
  4. 调用代理对象的目标方法(也就是request方法,代理类也实现了Subject这个接口),调用转发到InvocationHandler.invoke方法当中,执行invoke的逻辑(我们自己的InvocationHandler实现)

3、Cglib代理

什么是CGLIB

CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib

为什么使用CGLIB

CGLIB代理主要通过对字节码的操作,为对象引入间接级别,以控制对象的访问。我们知道Java中有一个动态代理也是做这个事情的,那我们为什么不直接使用Java动态代理,而要使用CGLIB呢?答案是CGLIB相比于JDK动态代理更加强大,JDK动态代理虽然简单易用,但是其有一个致命缺陷是,只能对接口进行代理。如果要代理的类为一个普通类、没有接口,那么Java动态代理就没法使用了。关于Java动态代理,可以参者这里Java动态代理分析

参考文章

  1. 轻松学,Java 中的代理模式及动态代理

results matching ""

    No results matching ""