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

时间:2010-02-09 09:02:44

标签: java spring dynamic-proxy

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

6 个答案:

答案 0 :(得分:47)

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

通常你有。

Caller --> Real object

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

Caller --> Proxy --> Real object

代理启动事务。

Here is nice article解释代理的本质及其在春天的效率(表现)

答案 1 :(得分:18)

dynamic proxy是JDK的一项功能。它可用于使用an invocation handler实现接口。

  

动态代理类(简称为   作为下面的代理类)是一个类   实现接口列表   在类的运行时指定   创建,具有所描述的行为   下面。代理接口就是这样的   由a实现的接口   代理类。代理实例是一个   代理类的实例。每个代理   instance有一个关联的调用   handler对象,它实现了   接口InvocationHandler。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

Spring AOP使用JDK动态代理或CGLIB创建给定目标对象的代理。 (只要有选择,首选JDK动态代理)。 如果要代理的目标对象实现了至少一个接口,则将使用JDK动态代理。目标类型实现的所有接口都将被代理。如果目标对象未实现任何接口,则将创建CGLIB代理。