2016-06-30 13 views
3

Diese Frage ist in Bezug auf die Probe: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-jersey/src/main/java/sample/jersey/Endpoint.javaWarum brauchen wir @Component Spring Annotation für Jersey Ressource im Frühjahr-Boot-Starter-Jersey-Projekt?

Warum tun wir „@Component“ Anmerkung für Jersey Ressource bei der Verwendung von feder Boot -Starter-Trikot Projekt gebraucht werden?

Wenn ich es entferne, kann das Jersey-Servlet immer noch Ressourcen bedienen.

Also was ist die Notwendigkeit für "@Component"?

+0

Sobald Sie andere Spring Komponenten injizieren wollen, muss die Ressource auch eine Federkomponente sein. – dunni

Antwort

1

Sie nicht brauchen es. Jersey verwendet HK2, da es ein internes DI-Framework ist, und HK2 hat eine . Dies wird intern verwendet, um Spring-Komponenten in den HK2-IoC-Container zu überbrücken, sodass sie in Jersey-Komponenten injiziert werden können. Und Jersey implementiert eine AutowiredInjectionResolver , die für die Injektion von Federkomponenten mit @Autowired ermöglicht. Sie brauchen nicht einmal @Autowired. Alle Federkomponenten können mit dem normalen @Inject gespritzt werden.

Der einzige Nachteil, den ich in, Jersey-Komponenten ein Spring @Component nicht gemacht hat, ist, dass es @Value nicht unterstützt, wenn Sie Eigenschaftswerte injizieren möchten.

Die eine Sache, die ich nicht wie ist, dass, wenn Sie etwas ein Frühling @Component erklären, macht es es automatisch ein Singleton. Aber Jerseyressourcen sind standardmäßig auf Anfrage beschränkt. Sie können eine Spring @Scope("request") hinzufügen und die Ressource in eine Ressource mit Anforderungsbereichs ändern. Jersey hat declared the Spring RequestScope, also können wir es benutzen. Wie genau es mit Jerseys Anforderung übereinstimmt, bin ich mir nicht hundertprozentig sicher. Ich bin vor einiger Zeit auf ein Problem gestoßen. Ich kann mich nicht erinnern, was es war, aber das hat mich davon abgehalten, jemals wieder den Spring-Anforderungsbereich zu verwenden.

Angenommen, ich möchte alle meine Resources-Anfrage beschränken, würde ich mich an den normalen Jersey-Anfrage-Bereich halten, und nicht in der Lage sein, @Value s zu injizieren, über Spring Request Umfang zu verwenden. Vielleicht Dinge, die ich stelle mir vor, und es war kein Problem mit ihm, aber persönlich werde ich bleibe nur, was ich sicher wissen :-)


1 - Ein InjectionResolver können Sie benutzerdefinierte Anmerkungen verwenden, um Injektionsziele zu erstellen.

0

Wenn Sie @Component entfernen, übernimmt Jersey die Kontrolle über den Umfang der Instanz. Mit @Component eine Singleton-Instanz erstellt wird, es zu entfernen können Sie die folgenden Jersey Anmerkungen verwenden:

• Anforderung Umfang (Default): Durch die Verwendung der @RequestScope Anmerkung oder keine, können wir einen Lebenszyklus bis haben die Anfrage dauert. Dies ist der Standardbereich der Root-Ressourcenklassen. Für jeder neuen Anforderung wird eine neue Root-Ressourceninstanz erstellt und entsprechend zum ersten Mal bedient. Wenn jedoch dieselbe Root-Ressourcenmethode aufgerufen wird, wird die alte Instanz verwendet, um die Anforderung zu bedienen.

• Per-Lookup-Bereich: Die Annotation @PerLookup erstellt für jede Anforderung Root-Ressourceninstanzen.

• Singleton: Mit der Annotation @Singleton können Sie in der gesamten Anwendung nur eine einzige Instanz erstellen.


Probieren Sie verschiedene Verhaltensweisen einen Zähler in Ihrer Klasse mit ...

public class MyWebResource { 
private int counter; 

@GET 
@Path("/counter") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getCounter() { 
    counter++; 
    return Response.status(Status.OK).entity(counter).build(); 
} 

}