Verwenden von Jersey mit Spring Boot
In der Spring Boot-Referenzdokumentation im Abschnitt 7.3 JAX-RS und Jersey wird erwähnt, dass alle registrierten Endpunkte @Components mit HTTP-Ressourcenanmerkungen (@GET und andere) sein sollten. Da der Endpunkt eine Spring @Component ist, wird sein Lebenszyklus von Spring verwaltet und Sie können die Annotation @Autowired verwenden, um Abhängigkeiten einzufügen, und die Annotation @Value verwenden, um die externe Konfiguration einzufügen . "
Es ist mir jedoch egal, ob Abhängigkeiten oder externe Konfigurationen in meine Jersey-Ressourcen eingefügt werden, und daher habe ich meine Jersey-Ressourcen nicht als @Components kommentiert. Meine App funktioniert einwandfrei.
Nach dem Lesen der Spring Boot-Referenzdokumentation schien die Registrierung von Jersey-Ressourcen als @Components eine Voraussetzung zu sein. Dies scheint jedoch nicht der Fall zu sein. Für mich scheint dies ein kleiner Fehler in der Spring Boot-Referenzdokumentation zu sein. Möglicherweise kann die Dokumentation von " Registrierte Endpunkte sollten @Komponenten sein " auf " Registrierte Endpunkte können @Komponenten sein " aktualisiert werden . Macht das Sinn?
Antworten
Ich habe dies ausprobiert und festgestellt, dass das Annotieren einer Jersey-Ressource mit der Spring @ Component-Annotation optional ist. Wenn Sie diese Annotation verwenden, wird der Lebenszyklus der Ressource von Spring verwaltet. Wenn Sie diese Annotation NICHT verwenden, wird der Lebenszyklus von Jersey verwaltet.
Eine wichtige Sache ist, dass es einen großen Unterschied gibt, wie dieser Lebenszyklus standardmäßig zwischen den beiden programmiert ist.
Wie in Abschnitt 3.4 des Jersey-Benutzerhandbuchs angegeben " Standardmäßig ist der Lebenszyklus von Stammressourcenklassen pro Anforderung, dh, dass jedes Mal, wenn der Anforderungs-URI-Pfad mit der Stammressource übereinstimmt, eine neue Instanz einer Stammressourcenklasse erstellt wird. Dies stellt ein sehr natürliches Programmiermodell dar, bei dem Konstruktoren und Felder ohne Rücksicht auf mehrere gleichzeitige Anforderungen an dieselbe Ressource verwendet werden können. Im Allgemeinen ist dies wahrscheinlich keine Ursache für Leistungsprobleme. Die Klassenkonstruktion und die Speicherbereinigung von JVMs wurden erheblich verbessert Die Jahre und viele Objekte werden erstellt und verworfen, um die HTTP-Anforderung zu bedienen und zu verarbeiten und die HTTP-Antwort zurückzugeben. "
Aber wie in der Spring Framework-Dokumentation in Abschnitt 1.5 angegeben ; Beans sind standardmäßig Singleton. "Der Spring IoC-Container erstellt genau eine Instanz des durch diese Bean-Definition definierten Objekts. Diese einzelne Instanz wird in einem Cache solcher Singleton-Beans gespeichert, und alle nachfolgenden Anforderungen und Referenzen für diese benannte Bean geben das zwischengespeicherte Objekt zurück. "
Daher gibt es einen Unterschied. Normale Jersey-Stammressourcenklassen werden standardmäßig pro Anforderung instanziiert, während bei Spring eine Ressource, die mit @Component kommentiert wird, Singleton ist. dh nur eine Instanz für die Lebensdauer der JVM. Wenn Sie möchten, dass von Spring verwaltete Ressourcen denselben Lebenszyklus pro Anforderung haben wie normale Jersey-Ressourcen, sollten Sie die Spring- @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST)Annotation zusätzlich zur @ Component-Annotation hinzufügen. Durch Hinzufügen wird Ihr Ressourcenlebenszyklus nun pro Anforderung angezeigt.