2010-02-09 43 views

risposta

11

Il dynamic proxy è una funzionalità del JDK. Può essere utilizzato per implementare un'interfaccia utilizzando an invocation handler.

Una classe proxy dinamico (indicato semplicemente come una classe proxy sotto) è una classe che implementa un elenco di interfacce specificate in runtime quando la classe è creato, con il comportamento descritti seguito. Un'interfaccia proxy è un'interfaccia di tipo implementata da una classe proxy . Un'istanza proxy è un'istanza di una classe proxy. Ogni istanza del proxy ha un oggetto di gestione di richiamo associato, che implementa l'interfaccia InvocationHandler.

Un proxy dinamico ha un sovraccarico. Per la maggior parte dei casi d'uso, tuttavia, il sovraccarico non sarà significativo. Il vero problema è che l'uso (eccessivo) dei proxy dinamici rende più difficile la comprensione e il debug dell'applicazione. Ad esempio un proxy dinamico verrà visualizzato con linee multiple in uno stacktrace.

I proxy dinamici vengono spesso utilizzati per implementare decorators. Un esempio di questo è AOP in primavera. (Non voglio entrare nei dettagli di AOP e non userò la terminologia AOP per mantenere le cose semplici). Dove alcune preoccupazioni sono implementate in una classe e utilizzate in molti posti. I proxy dinamici (e i gestori di invocazione) sono solo il codice della colla (fornito da Spring) per intercettare le chiamate al metodo. (In realtà, i proxy dinamici sono solo un dettaglio di implementazione di questa funzionalità. Generare le classi al volo è un'altra possibilità per implementarlo.)

+0

Perché lo implementiamo? Voglio chiedere della metologia o delle stesse cose – Linh

37

I proxy sono utilizzati da AOP. In breve:

Normalmente.

Caller --> Real object 

Ma quando, per esempio, si desidera la gestione delle transazioni automatica, la primavera mette un proxy del vostro oggetto reale

Caller --> Proxy --> Real object 

in cui il proxy inizia la transazione.

Here is nice article spiegare sia l'essenza del proxy e la loro efficienza (performance) in primavera

+5

Bozho, è una spiegazione molto bella. – lwpro2

+0

domanda successiva: perché la primavera ha bisogno di usare a? Conosco solo l'annotazione @Transaction – gstackoverflow

+0

Molte altre cose. Caching, per esempio. Registrazione. Sentiero di controllo. O qualunque altra cosa tu possa sviluppare da solo – Bozho

0

Possiamo aggiungere una funzionalità di classe Java modificando il codice sorgente/byte o utilizzando sottoclasse o un proxy che incorpora la funzionalità aggiuntive e delega le chiamate all'oggetto sottostante.

0

AOP può anche utilizzare i proxy CGLIB. Questo è usato per il proxy delle classi invece delle interfacce.

0

Le altre risposte sono buone, ma ecco come ci penso in termini molto semplici.

  1. Un'annotazione significa "aggiungi codice nascosto per comportamento aggiuntivo".
  2. Il framework (o chissà cosa significhi l'annotazione) aggiunge bytecode, Spring in fase di esecuzione, AspectJ in fase di compilazione, ad esempio.
  3. Aggiunge codice come proxy insieme a un intercettore. (Un wrapper, decoratore, adattatore sono simili e potrebbero essere più facili da capire di "proxy".)
  4. Quando il programma viene eseguito, l'intercettore invia l'esecuzione al proxy che fa la sua cosa, che quindi può o non può inviare l'esecuzione a la classe che hai codificato e che "avvolge".