不知道spring使用proxy是什么意思。什么是有效的?
问问题
34723 次
5 回答
23
动态代理是 JDK 的一个特性。它可用于使用调用处理程序实现接口。
动态代理类(以下简称为代理类)是一个实现类创建时在运行时指定的接口列表的类,其行为如下所述。代理接口就是这样一个由代理类实现的接口。代理实例是代理类的实例。每个代理实例都有一个关联的调用处理程序对象,该对象实现了接口 InvocationHandler。
动态代理有一些开销。不过,对于大多数用例来说,开销不会很大。真正的问题是(过度)使用动态代理使应用程序更难理解和调试。例如,动态代理将在堆栈跟踪中显示多行。
动态代理通常用于实现装饰器。Spring 中的 AOP 就是一个例子。(我不想深入了解AOP的细节,也不会使用 AOP 术语来保持简单)。某些关注点在一个类中实现并在许多地方使用。动态代理(和调用处理程序)只是拦截方法调用的胶水代码(由 Spring 提供)。(实际上,动态代理只是此功能的一个实现细节。动态生成类是实现它的另一种可能性。)
于 2010-02-09T09:06:21.837 回答
2
我们可以通过修改源代码/字节代码或使用嵌入附加功能并将调用委托给底层对象的子类或代理来向 Java 类添加功能。
于 2012-09-24T06:09:14.650 回答
0
AOP 也可以使用 CGLIB 代理。这用于代理类而不是接口。
于 2015-06-17T09:46:03.577 回答
0
其他答案很好,但这是我用非常简单的术语来看待它的方式。
- 注释的意思是“为额外的行为添加隐藏代码”。
- 例如,框架(或任何知道注解含义的东西)添加字节码,在运行时添加 Spring,在编译时添加 AspectJ。
- 它将代码添加为代理和拦截器。(包装器、装饰器、适配器是相似的,可能比“代理”更容易理解。)
- 当程序运行时,拦截器将执行发送到执行它的代理,然后代理可能会或可能不会将执行发送到您编码的类并且它“包装”。
于 2017-06-07T14:36:40.717 回答