Utilizzo di Jersey con Spring Boot
La documentazione di riferimento di Spring Boot nella sezione 7.3 JAX-RS e Jersey menziona " Tutti gli endpoint registrati dovrebbero essere @Components con annotazioni di risorse HTTP (@GET e altri). Poiché l'endpoint è un @Component Spring, il suo ciclo di vita è gestito da Spring e puoi usare l'annotazione @Autowired per iniettare dipendenze e usare l'annotazione @Value per iniettare la configurazione esterna ".
Ma non mi interessa che le dipendenze vengano iniettate o la configurazione esterna iniettata nelle mie risorse Jersey e quindi non ho annotato le mie risorse Jersey come @Components. La mia app funziona perfettamente.
Dalla lettura della documentazione di riferimento di Spring Boot, è sembrato che la registrazione delle risorse Jersey come @Components fosse un requisito. Ma non sembra essere così. A me questo sembra un piccolo bug nella documentazione di riferimento di Spring Boot. Può essere che la documentazione possa essere aggiornata da " gli endpoint registrati dovrebbero essere @Components " a " gli endpoint registrati possono essere @Components ". Ha senso ciò?
Risposte
L'ho provato e ho scoperto che l'annotazione di una risorsa Jersey con l'annotazione Spring @Component è facoltativa. Se usi quell'annotazione, il ciclo di vita della risorsa sarà gestito da Spring e se NON usi quell'annotazione, il ciclo di vita sarà gestito da Jersey.
Una cosa importante da notare è che c'è una grande differenza nel modo in cui quel ciclo di vita è programmato per impostazione predefinita tra i due.
Come indicato nella sezione 3.4 della Jersey User Guide " Per impostazione predefinita, il ciclo di vita delle classi di risorse root è per richiesta, ovvero una nuova istanza di una classe di risorse root viene creata ogni volta che il percorso dell'URI della richiesta corrisponde alla risorsa root. Questo rende un modello di programmazione molto naturale in cui costruttori e campi possono essere utilizzati senza preoccuparsi di più richieste simultanee alla stessa risorsa. In generale è improbabile che questa sia una causa di problemi di prestazioni. La costruzione di classi e la raccolta dei rifiuti delle JVM è notevolmente migliorata gli anni e molti oggetti verranno creati e scartati per servire ed elaborare la richiesta HTTP e restituire la risposta HTTP " .
Ma come affermato nella sezione 1.5 della documentazione del framework di primavera ; i bean per impostazione predefinita sono singleton. " Il contenitore Spring IoC crea esattamente un'istanza dell'oggetto definito da quella definizione di bean. Questa singola istanza è memorizzata in una cache di tali bean singleton e tutte le successive richieste e riferimenti per quel bean denominato restituiscono l'oggetto memorizzato nella cache. "
Quindi c'è una differenza. Le normali classi di risorse radice di Jersey per impostazione predefinita vengono istanziate per richiesta, mentre con Spring quando una risorsa viene annotata con @Component sarà singleton. cioè una sola istanza per la durata della JVM. Se si desidera che le risorse gestite da Spring abbiano lo stesso ciclo di vita per richiesta fornito con le normali risorse Jersey, è necessario aggiungere l' @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST)annotazione Spring oltre all'annotazione @Component. Aggiungendolo, il ciclo di vita delle risorse sarà ora per richiesta.