webentwicklung-frage-antwort-db.com.de

Spring Bean Scopes

Kann jemand erklären, was die Bereiche in Spring Beans sind? Ich habe immer nur "Prototyp" verwendet, aber gibt es andere Parameter, die ich dafür einsetzen kann?

Beispiel, worüber ich spreche

    <bean id="customerInfoController" class="com.action.customer.Controller" scope="prototype">
    <property name="accountDao" ref="accountDao"/>
    <property name="utilityDao" ref="utilityDao"/>
    <property name="account_usageDao" ref="account_usageDao"/>  
</bean>
45
gcalex5

Aus den spring specs werden fünf Arten von Bohnenscopes unterstützt:

1. singleton (default *)

Umfasst eine einzelne Bean-Definition auf eine einzelne Objektinstanz pro Spring IoC-Container.

2. Prototyp

Umfasst eine einzelne Bean-Definition auf eine beliebige Anzahl von Objektinstanzen.

3. anfrage

Umfasst eine einzelne Bean-Definition auf den Lebenszyklus eines einzelnen HTTP anfordern; Das heißt, jede HTTP-Anfrage hat ihre eigene Instanz einer Bean, die hinter einer einzigen Bean-Definition erstellt wurde . Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

4. Sitzung

Umfasst eine einzelne Bean-Definition auf den Lebenszyklus einer HTTP-Sitzung. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

5. globale Sitzung

Umfasst eine einzelne Bean-Definition auf den Lebenszyklus eines globalen HTTP Session. Normalerweise nur gültig bei Verwendung in einem Portlet-Kontext. Nur gültig im Kontext eines webfähigen Spring ApplicationContext.

* default bedeutet, wenn im <bean />-Tag kein expliziter Gültigkeitsbereich angegeben ist Weitere Informationen dazu finden Sie hier: http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04 .html

73
Juned Ahsan

In Spring wird der Bean-Bereich verwendet, um zu entscheiden, welche Art von Bean-Instanz aus dem Spring-Container an den Aufrufer zurückgegeben werden soll.

Es werden 5 Arten von Bean-Scopes unterstützt:

  1. Singleton: Es gibt eine einzelne Bean-Instanz pro Spring-IoC-Container zurück. Diese einzelne Instanz wird in einem Cache dieser Singleton-Beans gespeichert, und alle nachfolgenden Anforderungen und Verweise für diese benannte Bean geben das zwischengespeicherte Objekt zurück in der Bean-Konfigurationsdatei angegeben, default für Singleton.

  2. Prototype : Es gibt bei Aufforderung jedes Mal eine neue Bean-Instanz zurück. Es speichert keine Cache-Version wie Singleton. 

  3. Request : Gibt eine einzelne Bean-Instanz pro HTTP-Anfrage zurück.

  4. Session : Gibt eine einzelne Bean-Instanz pro HTTP-Sitzung zurück (Sitzung auf Benutzerebene).

  5. GlobalSession : Gibt eine einzelne Bean-Instanz pro globale HTTP-Sitzung zurück. Sie ist nur im Kontext einer webfähigen Spring ApplicationContext-Sitzung (Anwendungsebene) gültig.

In den meisten Fällen können Sie sich nur mit dem Kernbereich des Spring - Singleton und Prototyp befassen, und der Standardbereich ist Singleton .

18

Ich möchte nur aktualisieren, dass in Spring 5, wie in Spring docs erwähnt, Spring 6 Bereiche unterstützt, von denen vier nur verfügbar sind, wenn Sie einen webfähigen ApplicationContext verwenden.

singleton (Standardeinstellung) Umfasst eine einzelne Bean-Definition pro Spring-IoC-Container auf eine einzelne Objektinstanz.

Prototyp Umfasst eine einzelne Bean-Definition auf eine beliebige Anzahl von Objektinstanzen.

request Umfasst eine einzelne Bean-Definition auf den Lebenszyklus einer einzelnen HTTP-Anforderung. Das heißt, für jede HTTP-Anforderung wird eine eigene Instanz einer Bean erstellt, die hinter einer einzelnen Bean-Definition erstellt wird. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

session Umfasst eine einzelne Bean-Definition auf den Lebenszyklus einer HTTP-Sitzung. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

Anwendung Umfasst eine einzelne Bean-Definition auf den Lebenszyklus eines ServletContext. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

websocket Umfasst eine einzelne Bean-Definition auf den Lebenszyklus eines WebSocket. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

6
heyjr

Die Spring-Dokumentation beschreibt die Standardbereiche :

singleton: (Standard) Umfasst eine einzelne Bean-Definition pro Spring-IoC-Container auf eine einzelne Objektinstanz.

prototype: Umfasst eine einzelne Bean-Definition auf eine beliebige Anzahl von Objektinstanzen.

request: Umfasst eine einzelne Bean-Definition auf den Lebenszyklus einer einzelnen HTTP-Anforderung. Das heißt, für jede HTTP-Anforderung wird eine eigene Instanz einer Bean erstellt, die hinter einer einzelnen Bean-Definition erstellt wird. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

session: Umfasst eine einzelne Bean-Definition auf den Lebenszyklus einer HTTP-Sitzung. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

global session: Umfasst eine einzelne Bean-Definition auf den Lebenszyklus einer globalen HTTP-Sitzung. Normalerweise nur gültig bei Verwendung in einem Portlet-Kontext. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

Zusätzliche benutzerdefinierte Bereiche können auch mit einer CustomScopeConfigurer erstellt und konfiguriert werden. Ein Beispiel wäre der von Spring Webflow hinzugefügte Bereich flow.

Sie argumentieren übrigens, dass Sie immer prototype verwendet haben, was ich merkwürdig finde. Der Standardumfang ist singleton und in meiner Anwendung brauche ich selten den Prototypumfang. Sie sollten sich das vielleicht mal ansehen.

5
LaurentG

Ausführliche Erläuterungen zu den einzelnen Bereichen finden Sie hier in Spring-Bean-Scopes . Unten ist die Zusammenfassung

Singleton (Standardeinstellung) Eine einzelne Bean-Definition wird auf eine einzelne Objektinstanz pro Spring-IoC-Container festgelegt.

prototype - Umfasst eine einzelne Bean-Definition auf eine beliebige Anzahl von Objektinstanzen.

request - Umfasst eine einzelne Bean-Definition auf den Lebenszyklus einer einzelnen HTTP-Anforderung. Das heißt, für jede HTTP-Anforderung wird eine eigene Instanz einer Bean erstellt, die hinter einer einzelnen Bean-Definition erstellt wird. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

session - Umfasst eine einzelne Bean-Definition auf den Lebenszyklus einer HTTP-Sitzung. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

global session - Umfasst eine einzelne Bean-Definition auf den Lebenszyklus einer globalen HTTP-Sitzung. Normalerweise nur gültig bei Verwendung in einem Portlet-Kontext. Nur gültig im Zusammenhang mit einem webfähigen Spring ApplicationContext.

5
Vikas V

Über Prototyp-Bean (s):

Der Clientcode muss Objekte im Prototypbereich bereinigen und .__ freigeben. teure Ressourcen, die die Prototyp-Bean (s) halten. Um das zu bekommen Frühlingscontainer zur Freigabe von Ressourcen, die von Beans mit Prototypen gespeichert werden, Versuchen Sie es mit einem benutzerdefinierten Bean-Post-Prozessor, der eine Referenz auf .__ enthält. Bohnen, die aufgeräumt werden müssen.

ref: https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html#beans-factory-scopes-prototype

0
emon

Entsprechend der Dokumentation von Spring-Cloud-Config gibt es einen zusätzlichen Bereich neben den vorhandenen fünf. Es ist @RefreshScope.

Dies ist die kurze Beschreibung von RefreshScope:

Bei einer Konfigurationsänderung eine Spring @Bean, die als .__ markiert ist. @RefreshScope wird speziell behandelt. Diese Funktion adressiert die Problem von Stateful-Beans, bei denen nur ihre Konfiguration injiziert wird wenn sie initialisiert werden. Zum Beispiel, wenn eine DataSource geöffnet ist Verbindungen, wenn die Datenbank-URL über die Umgebung geändert wird, können Sie Wahrscheinlich möchten die Inhaber dieser Verbindungen was sie tun. Dann leiht sich das nächste Mal etwas Verbindung aus dem Pool, erhält es eine mit der neuen URL.

Manchmal ist es sogar obligatorisch, @RefreshScope .__ anzuwenden. Anmerkungen zu einigen Beans, die nur einmal initialisiert werden können. Wenn eine Bohne "unveränderlich" ist, müssen Sie die Bean entweder mit .__ kommentieren. @RefreshScope oder geben Sie den Klassennamen unter dem Eigenschaftsschlüssel an spring.cloud.refresh.extra-erfrischbar.

Aktualisierungsbereichsbeans sind träge Proxies, die sich initialisieren, wenn sie .__ sind. verwendet (das heißt, wenn eine Methode aufgerufen wird) und der Bereich als Cache fungiert von initialisierten Werten. So erzwingen Sie, dass eine Bean beim nächsten .__ neu initialisiert wird. Methodenaufruf müssen Sie seinen Cache-Eintrag ungültig machen.

Das RefreshScope ist eine Bean im Kontext und hat ein öffentliches refreshAll () - Methode zum Aktualisieren aller Beans im Bereich durch Löschen der Ziel-Cache Der/refresh-Endpunkt macht diese Funktionalität verfügbar (über HTTP oder JMX). Um eine einzelne Bean nach Namen zu aktualisieren, gibt es auch eine Refresh (String) -Methode.

0
zappee