haricot proxy au spring

Quelqu’un peut-il expliquer l’utilisation de l’annotation Spring @ScopedProxy ? Je pensais que cela avait quelque chose à voir avec les haricots de séance, mais je ne sais pas trop quoi.

Dans mon utilisation des scopes, j’ai utilisé des beans de scope de session sans l’annotation @ScopedProxy (ou sans les proxys @ScopedProxy ), donc je suis vraiment sûr de savoir comment l’utiliser correctement.

La section 3.4.4.5 des documents de spring explique assez bien:

(veuillez noter que la définition suivante du bean “userPreferences” est incomplète):

     

À partir de la configuration ci-dessus, il est évident que le bean singleton ‘userManager’ reçoit une référence au ‘beanPreferences’ du bean HTTP Portée. 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 injectées qu’une fois! ) .

Cela signifie que le ‘userManager’ fonctionnera (conceptuellement) uniquement sur le même object ‘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 HTTP Portée en tant que dépendance dans un object collaborateur (généralement). Ce que nous voulons plutôt, c’est un object «userManager» unique par conteneur , puis, pendant toute la durée d’une session HTTP, nous voulons voir et utiliser un object «userPreferences» spécifique à ladite session HTTP .

Il vous faut plutôt injecter un object qui expose exactement la même interface publique que la classe UserPreferences (idéalement un object UserPreferences) et qui est suffisamment intelligent pour pouvoir extraire le véritable object UserPreferences. quel que soit le mécanisme de cadrage sous-jacent que nous avons choisi (requête HTTP, session, etc.). Nous pouvons alors injecter en toute sécurité cet object proxy dans le bean ‘userManager’, qui ignorera parfaitement que la référence UserPreferences sur laquelle il se trouve est un proxy .

Dans notre cas, lorsqu’une instance de UserManager invoque une méthode sur l’object UserPreferences à dependency injections, elle invoquera vraiment une méthode sur le proxy … le proxy se désactive alors et récupère le véritable object UserPreferences (dans ce cas) la session HTTP et déléguer l’appel de la méthode au véritable object 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 requête, session et globalSession dans des objects collaboratifs:

       

Après avoir essayé différentes options spécifiées ici et la documentation de spring, j’ai compris pour une raison quelconque que Spring MVC est un contrôleur à sélection automatique lorsque vous utilisez l’annotation @Controller et que vous avez plusieurs contrôleurs dans votre application Web. Modification de l’annotation à @RestController (value = “UniqueControllerv1”), le problème est résolu.