Abschnitt 3.4.4.5 der Frühlingsdokumente erklärt es ziemlich gut:
(Bitte beachten Sie, dass die folgende Bean-Definition 'userPreferences' derzeit 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 geht hervor, dass der Singleton-Bean 'userManager' mit einem Verweis auf die HTTP-Bean 'userPreferences' mit Sitzungsbereich eingefügt wird. Der herausragende Punkt hierbei ist, dass die 'userManager'-Bean ein Singleton ist ... sie wird genau einmal pro Container instanziiert , und ihre Abhängigkeiten (in diesem Fall nur eine, die' userPreferences'-Bean) werden ebenfalls nur einmal injiziert! ) .
Dies bedeutet, dass der 'userManager' (konzeptionell) immer nur mit genau demselben 'userPreferences'-Objekt arbeitet, mit dem er ursprünglich injiziert wurde.
Dies ist nicht das, was Sie möchten, wenn Sie eine HTTP-Bean mit Sitzungsbereich als Abhängigkeit (normalerweise) in ein zusammenarbeitendes Objekt einfügen. Wir möchten vielmehr ein einzelnes 'userManager'-Objekt pro Container . Anschließend möchten wir für die Lebensdauer einer HTTP-Sitzung ein' userPreferences'-Objekt anzeigen und verwenden , das für diese HTTP-Sitzung spezifisch ist .
Sie müssen dann eher eine Art Objekt einfügen, das genau dieselbe öffentliche Schnittstelle wie die UserPreferences-Klasse verfügbar macht (idealerweise ein Objekt, das eine UserPreferences-Instanz ist) und das intelligent genug ist, um das echte UserPreferences-Objekt abrufen zu können von dem zugrunde liegenden Scoping-Mechanismus, den wir ausgewählt haben (HTTP-Anforderung, Sitzung usw.). Wir können dieses Proxy-Objekt dann sicher in die 'userManager'-Bean einfügen, die glücklicherweise nicht weiß, dass die UserPreferences-Referenz, an der sie festhält, ein Proxy ist .
In unserem Fall ruft eine UserManager-Instanz , wenn sie eine Methode für das in Abhängigkeit injizierte UserPreferences-Objekt aufruft, tatsächlich eine Methode für den Proxy auf . Der Proxy geht dann aus und ruft das echte UserPreferences-Objekt ab (in diesem Fall). die HTTP-Sitzung und delegieren Sie den Methodenaufruf an das abgerufene echte UserPreferences-Objekt.
Aus diesem Grund benötigen Sie die folgende korrekte und vollständige Konfiguration, wenn Sie Beans mit Anforderungs-, Sitzungs- und globalem Sitzungsbereich 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>