在spring框架中使用代理(动态代理)是什么意思?

我不知道在spring使用代理的意义。 什么是有效的?

动态代理是JDK的一项function。 它可以用于使用调用处理程序实现接口。

动态代理类(下面简称为代理类)是一个类,它实现在创建类时在运行时指定的接口列表,其行为如下所述。 代理接口就是由代理类实现的接口。 代理实例是代理类的实例。 每个代理实例都有一个关联的调用处理程序对象,该对象实现了InvocationHandler接口。

动态代理有一些开销。 但是,对于大多数用例来说,开销并不重要。 真正的问题是动态代理的(过度)使用使得应用程序更难理解和调试。 例如,动态代理将在堆栈跟踪中显示多个行。

动态代理通常用于实现装饰器 。 其中一个例子是Spring的AOP。 (我不想深入了解AOP的细节,也不会使用AOP术语来保持简单)。 某些问题在一个类别中实施并在许多地方使用。 动态代理(和调用处理程序)只是用于拦截方法调用的粘合代码(由Spring提供)。 (实际上,动态代理只是此function的一个实现细节。动态生成类是实现它的另一种可能性。)

代理由AOP使用 。 简而言之:

通常你有。

Caller --> Real object 

但是,例如,当您想要自动事务管理时,spring会为您的真实对象设置代理

 Caller --> Proxy --> Real object 

代理启动事务的位置。

这篇文章很好地解释了代理的本质及其在spring的效率(性能)

我们可以通过修改源/字节代码或使用嵌入附加function的子类或代理并将调用委托给底层对象来向Java类添加function。

AOP也可以使用CGLIB代理。 这用于代理类而不是接口。

其他答案都很好,但这就是我用非常简单的术语来思考的问题。

  1. 注释意味着“为额外行为添加隐藏代码”。
  2. 例如,框架(或任何知道注释意味着什么)在运行时添加字节码,Spring,在编译时添加AspectJ。
  3. 它将代码与拦截器一起添加为代理。 (包装器,装饰器,适配器类似,可能比“代理”更容易理解。)
  4. 当程序运行时,拦截器将执行发送到执行其操作的代理,然后可能会或可能不会将执行发送到您编码的类并且“包装”。