2016-08-12 4 views
0

einen Fall betrachtet, wenn eine Prototyp-scoped Bohne in einen Singleton injiziert wird scoped Bohne,wie funktioniert scoped Proxy arbeitet intern im Frühjahr

wenn wir versuchen, Prototyp-scoped Bohne, um die Singleton-scoped Bohne verwenden, wir sind wird jedes Mal mit der gleichen Bean zurückgegeben, dh die Bean wird zum Zeitpunkt der Singleton-Initialisierung injiziert.

Wenn wir jedes Mal verschiedene Instanzen abrufen wollen, verwenden wir einen Bereichs-Proxy.

Ich habe nicht das Konzept bekommen, wie dieser Bereichs-Proxy hinter der Bühne funktioniert und wie er uns auf magische Weise eine neue Instanz gibt, selbst wenn die Bohne in einem Singleton vorhanden ist.

Antwort

0

aus: http://docs.spring.io/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes-other-injection

Lage zu sein, eine Bohne zu definieren scoped auf eine HTTP-Anforderung oder Session (oder in der Tat eines benutzerdefinierter Rahmen Ihres eigenen Planens) ist alles sehr gut, aber einer der wichtigsten wert fügt die Spring IoC Container ist, dass es nicht nur die Instanziierung Ihrer Objekte (Beans) verwaltet, sondern auch die Verschaltung von Mitarbeitern (oder Abhängigkeiten). Wenn Sie eine (beispielsweise) HTTP-Anforderungsbereichs-Bean in eine andere Bean injizieren möchten, müssen Sie einen AOP-Proxy anstelle der Bereichs-Bean injizieren. Das heißt, Sie müssen ein Proxy-Objekt injizieren, das die gleiche öffentliche Schnittstelle wie das Zielobjekt bereitstellt, aber intelligent genug ist, um das reale Zielobjekt aus dem relevanten Bereich (z. B. eine HTTP-Anforderung) und Delegate-Methode abrufen zu können ruft das reale Objekt auf.

Um einen solchen Proxy zu erstellen, müssen Sie nur ein untergeordnetes Element in eine Bereichsdefinition einfügen (möglicherweise benötigen Sie auch die CGLIB-Bibliothek in Ihrem Klassenpfad, damit der Container die klassenbasierte Proxyverarbeitung durchführen kann) Verwenden Sie Anhang A, XML Schema-basierte Konfiguration). Also, warum brauchen Sie dieses Element in der Definition von Beans, die bei der Anfrage, Sitzung, GlobalSession und "fügen Sie Ihren benutzerdefinierten Bereich hier" Ebene? Der Grund ist am besten erklärt sich durch die folgende Bohne Definition zerpflücken (bitte beachten Sie, dass die folgende ‚Benutzereinstellungen‘ Bean Definition, wie es steht unvollständig):

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

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

War es klar für Sie? – pacman