it-swarm.com.de

proxybohne mit Federbereich

Kann jemand die Verwendung der Anmerkung spring @ScopedProxy erklären? Ich dachte es hatte etwas mit Bohnen mit Sitzungsbereich zu tun, aber ich bin mir nicht ganz sicher, was.

Bei der Verwendung von Gültigkeitsbereichen habe ich Beans mit Gültigkeitsbereichen für Sitzungen ohne die Annotation @ScopedProxy (oder ohne Proxys mit Gültigkeitsbereich aop) verwendet. Ich bin mir also wirklich sicher, wie ich sie richtig verwenden soll.

89
Jeff Storey

Abschnitt 3.4.4.5 der Frühlingsdokumente erklärt es ziemlich gut:

(Bitte beachten Sie, dass die folgende Bean-Definition der 'userPreferences'-Bean unvollständig ist):

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>

Aus der obigen Konfiguration ist ersichtlich, dass der Singleton-Bean 'userManager' ein Verweis auf die HTTP-Session-basierten Bean 'userPreferences' eingefügt wird. Der wichtigste Punkt hier ist, dass die Bean 'userManager' ein Singleton ist ... es wird genau einmal pro Container instanziiert, und ihre Abhängigkeiten (in diesem Fall nur eine, die Bean 'userPreferences') wird auch nur einmal (einmalig!) injiziert}.

Dies bedeutet, dass der 'userManager' (konzeptionell) immer nur das gleiche 'userPreferences'-Objekt bearbeitet, dh das Objekt, mit dem es ursprünglich injiziert wurde.

Dies ist nicht das, was Sie möchten, wenn Sie ein HTTP-Session-Scope-Bean als Abhängigkeit in ein kollaborierendes Objekt einfügen (normalerweise). Was wir wollen, ist ein einzelnes "userManager" -Objekt pro Container und dann für die Lebensdauer einer HTTP-Sitzung möchten wir ein 'anzeigen und verwenden') userPreferences-Objekt, das für diese HTTP-Sitzung spezifisch ist.

Stattdessen müssen Sie eine Art Objekt einfügen, das genau dieselbe öffentliche Schnittstelle wie die UserPreferences-Klasse (idealerweise ein Objekt, das eine UserPreferences-Instanz ist) verfügbar macht und das intelligent genug ist, um das echte UserPreferences-Objekt abzurufen von dem zugrunde liegenden Scoping-Mechanismus (HTTP-Anfrage, Sitzung usw.). Wir können dieses Proxy-Objekt dann sicher in die Bean 'userManager' injizieren. Die Bean wird nicht wissen, dass der Verweis UserPreferences, an den sie sich hält, ein proxy ist. 

In unserem Fall ruft eine UserManager-Instanz eine Methode für das in Abhängigkeitsinjektive UserPreferences-Objekt aufgerufene Objekt auf, wird tatsächlich eine Methode für den Proxy aufgerufen. ... Der Proxy geht dann ab und holt das echte UserPreferences-Objekt (in diesem Fall) aus der HTTP-Sitzung und delegiert den Methodenaufruf an das abgerufene echte UserPreferences-Objekt.

Aus diesem Grund benötigen Sie die folgende, korrekte und vollständige Konfiguration, wenn Sie Beans auf Anfrage-, Sitzungs- und GlobalSession-Ebene in zusammenarbeitende Objekte einfügen:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
    <aop:scoped-proxy/>
</bean>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>
223
Gus

Nach dem Ausprobieren verschiedener hier spezifizierter Optionen und der Spring-Dokumentation habe ich Spring MVC aus irgendeinem Grund herausgefunden, dass der Controller bei der Verwendung der @Controller-Annotation seltsam autowiring ist und bei dem Sie mehr als einen solchen Controller in Ihrer Webapp haben. Wurde die Anmerkung in @RestController geändert (Wert = "UniqueControllerv1"), wurde das Problem behoben.

0
gr12828710