Bedeutet dies beim Annotieren einer Klasse mit @Component, dass es sich um Spring Bean und Singleton handelt?

110

Da ich für Spring ziemlich neu bin, habe ich eine Frage zum Kommentieren einer Klasse. Bedeutet @Componentdies beim Annotieren einer Klasse mit, dass diese Klasse eine Spring Bean und standardmäßig ein Singleton ist?

Marco
quelle

Antworten:

129

Ja, das ist richtig, @Componentist eine Spring Bean und ein Singleton.

Wenn die Klasse zur Serviceschicht gehört, möchten Sie sie möglicherweise @Servicestattdessen mit Anmerkungen versehen

Beachten Sie jedoch, dass Sie diese Zeile einfügen müssen, damit diese Anmerkungen erkannt werden applicationContext.xml:

<context:component-scan base-package="com.yourcompany" />

Informationen zu Singletons - Spring Beans sind standardmäßig alle im Singleton-Bereich. Das einzige, was Sie beachten müssen, ist, dass Sie den Status nicht in Feldvariablen speichern sollten (sie sollten nur Abhängigkeiten enthalten). Somit ist Ihre Anwendung threadsicher und Sie benötigen nicht jedes Mal eine neue Instanz einer Bean. Mit anderen Worten, Ihre Bohnen sind staatenlos.

Bozho
quelle
1
Wenn ich die Annotationen @Component und / oder @Service usw. verwende, bedeutet dies, dass ich Singletons erstelle. Trete dann nicht auf Parallelitätsprobleme auf? Meiner neuen Idee nach führt dies zu einer Bean, die im gesamten ApplicationContext verwendet wird, sodass gleichzeitige Benutzer einen Verweis auf die einzelne Bean erhalten. Oder fehlt mir etwas?
Marco
3
@Marco Wenn Sie keinen Status haben (Instanzvariablen, die sich von Spring Beans unterscheiden), treten keine Parallelitätsprobleme auf.
Bozho
Sie "wollen" jedes Mal eine neue Instanz einer Bean oder Sie "wollen" nicht jedes Mal eine neue Instanz einer Bean?
Harshana
@Bozho Was meinst du mit: "und du wirst nicht jedes Mal eine neue Instanz einer Bohne benötigen"? Bedeuten Sie, dass Spring keine neue Instanz erstellen muss oder dass Sie als Entwickler keine neue Instanz erstellen müssen?
user1766169
24

Standardmäßig - Ja.

Sie können dieses Verhalten jedoch mithilfe der @ScopeAnmerkung überschreiben . Beispielsweise:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Lea Zus
quelle