Quelqu'un peut-il expliquer l'utilisation de l' @ScopedProxy
annotation de printemps ? Je pensais que cela avait quelque chose à voir avec les beans de session, mais je ne sais pas trop quoi.
Dans mon utilisation des étendues, j'ai utilisé des beans à portée de session sans @ScopedProxy
annotation (ou sans proxies à portée aop), donc je suis vraiment sûr de savoir comment l'utiliser correctement.
Réponses:
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):
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:
la source
@ScopedProxy
été remplacée par@RequestScope
et d'autres. Vous pouvez trouver des exemples ici: logicbig.com/tutorials/spring-framework/spring-core@Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)
est utilisée, SpringMVC n'utilise pas WebApplicationContext pour Autowired, mais utilise CGLIB pour créer le proxy ?. Voici des exemples d' autres explications surAprès avoir essayé diverses options différentes spécifiées ici et la documentation de printemps, j'ai compris pour une raison quelconque que Spring MVC est un contrôleur de câblage automatique bizarre lorsque vous utilisez l'annotation @Controller et que vous avez plusieurs contrôleurs de ce type dans votre application Web. Modification de l'annotation en @RestController (value = "UniqueControllerv1"), le problème est résolu.
la source