La section 3.4.4.5 de la documentation du printemps l'explique assez bien:
(veuillez noter que la définition suivante du bean 'userPreferences' telle qu'elle est est incomplète):
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
D'après la configuration ci-dessus, il est évident que le bean singleton 'userManager' est injecté avec une référence au bean à portée de session HTTP 'userPreferences'. Le point saillant ici est que le bean 'userManager' est un singleton ... il sera instancié exactement une fois par conteneur , et ses dépendances (dans ce cas une seule, le bean 'userPreferences') ne seront également injectées (une fois! ) .
Cela signifie que le 'userManager' ne fonctionnera (conceptuellement) que sur le même objet 'userPreferences', c'est-à-dire celui avec lequel il a été injecté à l'origine.
Ce n'est pas ce que vous voulez lorsque vous injectez un bean à portée de session HTTP en tant que dépendance dans un objet collaborant (généralement). Ce que nous voulons plutôt, c'est un seul objet 'userManager' par conteneur , puis, pendant la durée de vie d'une session HTTP, nous voulons voir et utiliser un objet 'userPreferences' qui est spécifique à ladite session HTTP .
Ce dont vous avez besoin est plutôt d'injecter une sorte d'objet qui expose exactement la même interface publique que la classe UserPreferences (idéalement un objet qui est une instance UserPreferences) et qui est suffisamment intelligent pour pouvoir aller chercher le véritable objet UserPreferences quel que soit le mécanisme de portée sous-jacent que nous avons choisi (requête HTTP, session, etc.). Nous pouvons alors injecter en toute sécurité cet objet proxy dans le bean 'userManager', qui ignorera parfaitement que la référence UserPreferences qu'il tient est un proxy .
Dans notre cas, lorsqu'une instance UserManager appelle une méthode sur l'objet UserPreferences injecté de dépendance, elle appellera vraiment une méthode sur le proxy ... le proxy va alors s'éteindre et récupérer le véritable objet UserPreferences à partir de (dans ce cas) la session HTTP et déléguez l'appel de méthode sur l'objet réel UserPreferences récupéré.
C'est pourquoi vous avez besoin de la configuration suivante, correcte et complète lors de l'injection de beans de type requête, session et globalSession dans des objets collaboratifs:
<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>