From Spring documentation:
Spring AOP utilizza sia proxy dinamici JDK o CGLIB per creare il proxy per un oggetto bersaglio. (I proxy dinamici JDK sono preferiti ogni volta che si ha una scelta).
Se l'oggetto di destinazione da proxy implementa almeno un'interfaccia, verrà utilizzato un proxy dinamico JDK. Tutte le interfacce implementate dal tipo di destinazione verranno proxy. Se l'oggetto di destinazione non implementa alcuna interfaccia, verrà creato un proxy CGLIB.
Se si desidera forzare l'utilizzo del proxy CGLIB (ad esempio, per eseguire il proxy di ogni metodo definito per l'oggetto di destinazione, non solo quelli implementati dalle sue interfacce) è possibile farlo. Tuttavia, ci sono alcuni aspetti da considerare:
i metodi finali non possono essere consigliati, in quanto non possono essere sostituiti.
Avrete bisogno dei binari CGLIB 2 sul classpath, mentre i proxy dinamici sono disponibili con JDK. Spring ti avviserà automaticamente quando ha bisogno di CGLIB e le classi della libreria CGLIB non vengono trovate sul classpath.
Il costruttore dell'oggetto proxy verrà chiamato due volte. Questa è una conseguenza naturale del modello di proxy CGLIB in base al quale viene generata una sottoclasse per ciascun oggetto proxy. Per ogni istanza proxy, vengono creati due oggetti: l'oggetto proxy reale e un'istanza della sottoclasse che implementa il consiglio. Questo comportamento non è mostrato quando si utilizzano i proxy JDK. Di solito, chiamare due volte il costruttore del tipo proxy, non è un problema, dato che di solito ci sono solo assegnazioni in corso e nessuna logica reale è implementata nel costruttore.
fonte
2018-01-30 08:33:18
Ottieni il codice qui:. In cglib puoi creare sia proxy di classe che proxy di interfaccia. Spring utilizza CGlib per impostazione predefinita mentre AspectJ utilizza il proxy Java. Leggi anche questo: http://jnb.ociweb.com/jnb/jnbNov2005.html;) –