2013-03-22 4 views
15

Im utilizzando Jersey Rest e voglio che un filtro Jersey abbia accesso ad alcuni fagioli primaverili.Utilizzo di proxy-target-class = "true" con Spring beans

tuttavia, come ho scoperto da altri thread, Jersey non ottiene i bean Spring se si tratta di proxy Java rispetto ai proxy java generati. Voglio aggiungere il proxy-target-class = "true"

Quali sono gli impatti di fare ciò e anche questo può essere impostato su un singolo bean o deve essere impostato su tutti i bean di riferimento?

risposta

22

Impostando proxy-target-class="true" si utilizzerà CGLIB2 per i proxy, invece di jdk proxys.

Le implicazioni sono i seguenti, come descritto in de documentation:

  • metodi finali non possano essere consigliata, in quanto non possono essere sovrascritte.

  • Avrete bisogno dei binari CGLIB 2 sul classpath, mentre i proxy dinamici sono disponibili con JDK. Primavera automaticamente avvisa quando ha bisogno di CGLIB e le classi di libreria CGLIB non sono trovate nel 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. In genere, chiamare il costruttore del tipo con proxy proxy due volte, non è un problema, in quanto di solito sono disponibili solo gli incarichi e non è stata implementata alcuna logica reale nel costruttore .

Inoltre, si dovrebbe essere in grado di fare un "target-proxy" per un componente specifico utilizzando

proxyMode=ScopedProxyMode.TARGET_CLASS 
+1

Si noti che è un errore di creare un proxy AOP con ambito per un bean Singleton. –

+0

Era un esempio. Modificato per evitare confusione. – gargc

+0

ma come esattamente lo imposto su un bean? Ad esempio ciò non riuscirà a lamentarsi dell'occorrenza del riferimento proxy-target – cduggan

12

Forzare un CGLIB-Proxy anche se il controller implementa formalmente un'interfaccia (SpringBoot 1.2.3.RELEASE con Primavera 4.1.6.RELEASE):

@Controller 
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class ServiceImpl implements ServiceIntf 
{ .... } 

Ciò consente @RequestMapping valido e funzionante e le annotazioni @Transactional

4

Usare la seguente annotazione nella classe Java primavera Config:

@EnableAspectJAutoProxy (proxyTargetClass = true)

+0

oh è bello ......... hai salvato io @ rcde0 – pk4393