7

我试图了解代理和动态代理模式之间的区别。从我到目前为止所读到的,我发现的唯一一件事是代理类字节码是在编译时创建的,而在动态代理上它是在运行时创建的。我还缺少其他差异吗?如果不是,那么选择代理而不是动态代理的原因是什么(性能问题除外)

4

2 回答 2

15

动态代理本质上是代理设计模式,其中代理对象是在运行时动态创建的。

代理设计模式使用代理,它充当客户端和底层真实对象之间的中介。在将请求委托给真实对象之前,程序员可以在代理中执行访问控制、验证和其他操作。

现在假设您想在调用任何类的任何方法之前执行一些通用操作,例如您想记录客户端进行的所有方法调用。在这种情况下,如果要实现代理设计模式,步骤如下:

  1. 为每个类创建代理类。
  2. 以某种方式实现代理类,首先它记录客户端进行的方法调用的日志条目,然后将调用委托给真实对象。

上述技术的问题是,假设你有 1000 个类,你需要为每个类编写 1000 个代理类,并在所有基本上做同样事情的类中实现所有方法(在我们的例子中执行日志记录操作),这是非常繁琐的过程和内存的浪费。

如果在运行时以某种方式,我们能够基于客户端的调用创建一个代理对象,然后在将调用委托给真实对象之前执行通用操作(在我们的例子中是日志操作),那不是更好吗?代理可以。

动态代理的流程如下:

  1. 客户端对对象调用一些操作。
  2. 系统在运行时根据客户端的调用创建一个代理对象。
  3. 代理对象调用一个泛型方法以在每次调用的情况下执行一个泛型操作。
  4. 动作之后,代理对象将调用委托给真实对象。

所以简而言之,如果您要执行一些通用操作,请使用动态代理,但如果您希望每个类都被区别对待(在某些类中执行日志记录,在某些类中不执行日志记录,在某些访问控制等中)使用简单代理人。希望我有所帮助。如果您需要代码示例,请告诉我。

于 2014-05-27T07:13:44.180 回答
1

我将尝试提供有关 Java 的动态代理和经典代理模式的信息。事实上,Java 的动态代理也是代理模式的一个例子。

在动态代理情况下,代理类是在运行时创建的,您使用 InvocationHandler 来定义其行为。这意味着动态代理类使用 InvocationHandler 作为其策略并将调用委托给其 InvocationHandler。

在经典代理模式中,您显式创建代理类并在此处实现您的逻辑。您可以在此处查看示例代码。

于 2017-04-13T13:35:40.533 回答