2010-02-09 15 views

Respuesta

11

El dynamic proxy es una característica del JDK. Se puede usar para implementar una interfaz usando an invocation handler.

Una clase proxy dinámico (denominado simplemente como una clase de proxy a continuación) es una clase que implementa una lista de interfaces especificados en tiempo de ejecución cuando la clase es creado, con el comportamiento tal como se describe continuación. Una interfaz proxy es una interfaz que se implementa mediante una clase de proxy . Una instancia de proxy es una instancia de una clase de proxy. Cada instancia de proxy tiene un objeto de controlador de invocación asociado , que implementa la interfaz InvocationHandler .

Un proxy dinámico tiene algunos gastos generales. Para la mayoría de los casos de uso, los gastos generales no serán significativos, sin embargo. El verdadero problema es que el (sobre) uso de proxies dinámicos hace que una aplicación sea más difícil de comprender y depurar. Por ejemplo, un proxy dinámico se mostrará con varias líneas en una pila stack.

Los proxies dinámicos se utilizan a menudo para implementar decorators. Un ejemplo de esto es AOP en Spring. (No quiero entrar en los detalles de AOP y no usaré la terminología de AOP para mantener las cosas simples). Donde ciertas preocupaciones se implementan en una clase y se usan en muchos lugares. Los proxies dinámicos (y los manejadores de invocación) son solo el código de pegamento (provisto por Spring) para interceptar las llamadas a métodos. (En realidad, los proxies dinámicos son solo un detalle de implementación de esta capacidad. Generar clases sobre la marcha es otra posibilidad para implementarlo.)

+0

¿Por qué implementamos eso? Quiero preguntar sobre la metodología o las mismas cosas – Linh

37

Los apoderados son utilizados por AOP. En resumen:

Normalmente lo tiene.

Caller --> Real object 

Pero cuando, por ejemplo, desea la gestión de transacciones automáticas, primavera pone un proxy de su objeto real

Caller --> Proxy --> Real object 

donde el proxy inicia la transacción.

Here is nice article explicar tanto la esencia de la representación y su eficiencia (rendimiento) en primavera

+5

Bozho, es una explicación muy buena. – lwpro2

+0

siguiente pregunta - ¿Por qué la primavera necesita usar aop? Solo conozco la anotación @Transaction – gstackoverflow

+0

Muchas otras cosas. Almacenamiento en caché, por ejemplo. Explotación florestal. Pista de auditoría. O cualquier otra cosa que puedas desarrollar tú mismo – Bozho

0

Podemos añadir una funcionalidad de clase Java mediante la modificación del código fuente/byte o mediante el uso de subclase o un proxy que incrusta la funcionalidad adicional y delega las llamadas al objeto subyacente.

0

AOP también puede usar proxies CGLIB. Esto se usa para proxy las clases en lugar de interfaces.

0

Las otras respuestas son buenas, pero así es como pienso en términos muy simples.

  1. Una anotación significa "agregar código oculto para un comportamiento adicional".
  2. El marco (o lo que sea que sepa lo que significa la anotación) agrega bytecode, Spring en tiempo de ejecución, AspectJ en tiempo de compilación, por ejemplo.
  3. Agrega código como un proxy junto con un interceptor. (Un envoltorio, decorador, adaptador son similares y pueden ser más fáciles de entender que "proxy").
  4. Cuando el programa se ejecuta, el interceptor envía la ejecución al proxy que hace lo suyo, que luego puede o no enviar la ejecución a la clase que codificaste y que "envuelve".
Cuestiones relacionadas