Usar Jersey con Spring Boot
La documentación de referencia de Spring Boot en la sección titulada 7.3 JAX-RS y Jersey menciona " Todos los puntos finales registrados deben ser @Components con anotaciones de recursos HTTP (@GET y otros). Dado que el punto final es un @Component de Spring, su ciclo de vida es administrado por Spring y puede usar la anotación @Autowired para inyectar dependencias y usar la anotación @Value para inyectar la configuración externa ".
Pero no me importa que se inyecten dependencias o una configuración externa en mis recursos de Jersey y, por lo tanto, no anoté mis recursos de Jersey como @Components. Mi aplicación funciona bien.
Al leer la documentación de referencia de Spring Boot, parecía que registrar los recursos de Jersey como @Components era un requisito. Pero ese no parece ser el caso. Para mí, esto parece un pequeño error en la Documentación de referencia de Spring Boot. Puede ser que la documentación se pueda actualizar desde " los puntos finales registrados deben ser @Components " hasta " los puntos finales registrados pueden ser @Components ". ¿Esto tiene sentido?
Respuestas
Probé esto y descubrí que anotar un recurso de Jersey con la anotación Spring @Component es opcional. Si usa esa anotación, Spring administrará el ciclo de vida del recurso y, si NO usa esa anotación, Jersey administrará el ciclo de vida.
Una cosa importante a tener en cuenta es que existe una gran diferencia en la forma en que ese ciclo de vida se programa de forma predeterminada entre los dos.
Como se indica en la sección 3.4 de la Guía del usuario de Jersey " De forma predeterminada, el ciclo de vida de las clases de recursos raíz es por solicitud, es decir, que se crea una nueva instancia de una clase de recurso raíz cada vez que la ruta del URI de la solicitud coincide con el recurso raíz. Esto lo convierte en un modelo de programación muy natural donde los constructores y los campos se pueden utilizar sin preocuparse por múltiples solicitudes concurrentes al mismo recurso. En general, es poco probable que esto sea una causa de problemas de rendimiento. los años y muchos objetos serán creados y descartados para servir y procesar la solicitud HTTP y devolver la respuesta HTTP " .
Pero como se indica en la sección 1.5 de Spring Framework Documentation ; los frijoles por defecto son singleton. " El contenedor Spring IoC crea exactamente una instancia del objeto definido por esa definición de bean. Esta instancia única se almacena en una caché de dichos beans singleton, y todas las solicitudes y referencias posteriores para ese bean con nombre devuelven el objeto en caché " .
De ahí que haya una diferencia. Las clases de recursos raíz de Jersey normales por defecto se instancian por solicitud, mientras que con Spring cuando un recurso se anota con @Component será singleton. es decir, solo una instancia durante la vida útil de la JVM. Si desea que los recursos administrados por Spring tengan el mismo ciclo de vida por solicitud que viene con los recursos normales de Jersey, debe agregar la @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST)anotación Spring además de la anotación @Component. Al agregarlo, el ciclo de vida de su recurso ahora será por solicitud.