Розділ 3.4.4.5 весняних документів досить добре пояснює:
(будь ласка, зауважте, що наведене нижче визначення "beanPreferences" є неповним):
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
З вищенаведеної конфігурації видно, що однотонному "userManager" вводиться посилання на HTTP-сеанс "userPreferences". Важливим моментом тут є те, що «userManager» bean є однотонним ... він буде інстанціюватися рівно один раз на контейнер , а його залежності (у цьому випадку лише одна, «userPreferences») також будуть введені лише один раз (один раз! ) .
Це означає, що "userManager" (концептуально) працюватиме лише колись із таким самим об'єктом "userPreferences", тобто тим, в який він був спочатку введений.
Це не те, що ви хочете, коли ви вводите об'єкт HTTP-сеансу як залежність в об'єкт, що співпрацює (як правило). Швидше, що ми хочемо - це один об'єкт "userManager" на контейнер , і тоді, протягом усього сеансу HTTP, ми хочемо побачити та використовувати об'єкт "userPreferences", який є специфічним для зазначеного HTTP-сесії .
Швидше за все, що вам потрібно - це ввести якийсь об'єкт, який відкриває такий самий публічний інтерфейс, що і клас UserPreferences (в ідеалі - це об'єкт, який є примірником UserPreferences), і який досить розумний, щоб можна було вийти з нього та отримати реальний об'єкт UserPreferences. з будь-якого базового механізму обстеження, який ми обрали (HTTP-запит, сесія тощо). Тоді ми можемо безпечно вводити цей проксі-об’єкт у поле "userManager", яке буде невідомо, що посилання UserPreferences, на які він утримує, - це проксі .
У нашому випадку, коли екземпляр UserManager викликає метод на об'єкті UserPreferences, який вводить залежність, він дійсно буде викликати метод на проксі-сервері ... проксі-сервер вимкнеться та отримає реальний об'єкт UserPreferences (у цьому випадку) сеанс HTTP і делегуйте виклик методу на отриманий реальний об'єкт UserPreferences.
Ось чому вам потрібна наступна, правильна та повна конфігурація при введенні бобів, що охоплюють запит, сеанс та глобальну сесію, в об'єкти, що співпрацюють:
<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>