Sekcja 3.4.4.5 dokumentacji wiosennej wyjaśnia to całkiem dobrze:
(należy pamiętać, że następująca definicja fasoli „userPreferences” w obecnej postaci jest niekompletna):
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
Z powyższej konfiguracji jasno wynika, że do pojedynczego komponentu bean „userManager” wstrzykuje się odwołanie do komponentu bean HTTP o zasięgu sesji „userPreferences”. Najistotniejsze jest tutaj to, że komponent bean „userManager” jest singletonem … zostanie utworzony dokładnie raz na kontener , a jego zależności (w tym przypadku tylko jedna, fasola „userPreferences”) również zostaną wstrzyknięte (raz! ) .
Oznacza to, że „userManager” będzie (koncepcyjnie) działał tylko na dokładnie tym samym obiekcie „userPreferences”, czyli tym, z którym został pierwotnie wstrzyknięty.
To nie jest to, czego chcesz, gdy wstrzykujesz komponent bean o zasięgu sesji HTTP jako zależność do współpracującego obiektu (zazwyczaj). Raczej to , czego chcemy, to pojedynczy obiekt „userManager” na kontener , a następnie, przez cały okres istnienia sesji HTTP, chcemy widzieć i używać obiektu „userPreferences”, który jest specyficzny dla wspomnianej sesji HTTP .
Raczej to, czego potrzebujesz, to wstrzyknięcie jakiegoś obiektu, który ujawnia dokładnie ten sam interfejs publiczny co klasa UserPreferences (najlepiej obiekt będący instancją UserPreferences) i który jest wystarczająco inteligentny, aby móc uruchomić i pobrać prawdziwy obiekt UserPreferences z dowolnego wybranego przez nas mechanizmu określania zakresu (żądanie HTTP, sesja itp.). Następnie możemy bezpiecznie wstrzyknąć ten obiekt proxy do komponentu bean „userManager”, który będzie błogo nieświadomy, że odwołanie UserPreferences, do którego się trzyma, jest proxy .
W naszym przypadku, gdy instancja UserManager wywołuje metodę na obiekcie UserPreferences z iniekcją zależności, tak naprawdę będzie wywoływać metodę na serwerze proxy ... serwer proxy wyłączy się i pobierze rzeczywisty obiekt UserPreferences z (w tym przypadku) sesji HTTP i deleguj wywołanie metody do pobranego rzeczywistego obiektu UserPreferences.
Dlatego podczas wstrzykiwania komponentów bean o zasięgu żądania, sesji i globalSession do współpracujących obiektów potrzebujesz następującej, poprawnej i kompletnej konfiguracji:
<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>