2010-05-07 12 views
1

@Autowired ne fonctionne qu'une seule fois.Spring @Autowired et WebApplicationContext dans Tomcat

Que faire pour câbler le grain à chaque recréation de la servlet?

Mon application Web (conteneur Tomcat6) se compose de 2 servlets. Chaque servlet a des champs privés.

Leurs setters sont marqués par @Autowired

Dans la méthode init J'utilise

 
WebApplicationContextUtils 
... 
autowireBean(this); 

Il autowires les propriétés marquées d'@Autowired une fois - lors de l'initialisation du Servlet. Toute autre session verra ces valeurs de champs, elles ne seront pas recâblées après la destruction de la session précédente

Que faire pour les rebrancher chaque fois qu'un constructeur de Servlet est appelé?

a) Mettre l'autowiring dans le constructeur?

Ou mieux 2) obtenir un contexte d'application Web et extraire un bean à partir de là?

+0

pourquoi n'essayez-vous pas d'autodétecter le fil? – ant

Répondre

1

Il semble y avoir un malentendu sur le fonctionnement de conteneurs. Les servlets sont essentiellement des singletons, vous n'obtenez pas de nouvelle servlet chaque fois que quelqu'un appelle le serveur. Stocker l'état dans des champs privés sur une servlet est à peu près une erreur.

Quelle est la portée et le cycle de vie de la partie dynamique de votre traitement des demandes? Si c'est juste la durée de la requête, vous pouvez prendre ce que votre servlet est en état et le déplacer dans une autre classe. Ensuite, vous pouvez définir un bean prototype pour cette classe et utiliser getBean au début de la requête pour en obtenir un nouveau. Si vous voulez commencer à vous faire plaisir, vous pouvez écrire un filtre qui place un nouveau bean dans un ThreadLocal au début de chaque requête.

Si votre état doit couvrir plusieurs requêtes, vous devez commencer à conserver l'état ou une clé qui pointe vers le stockage d'état sur la session Web ou envisager d'utiliser un cadre de conversation.

1

Essayez d'utiliser la portée prototype pour que le haricot @Scope("prototype")

+0

cela va forcer spirng à produire un nouveau bean chaque fois que l'on en a besoin – ant

+0

Cela demandera à Spring de faire un nouveau quand getBean est invoqué; Cependant, une servlet est toujours une servlet. Le marquage d'un prototype de bean n'appelle pas la magie noire qui fera que le conteneur servlet créera une nouvelle servlet pour chaque thread Web. Il fera toujours juste celui. – Affe

+0

@Affe est d'accord. J'ai manqué le point là. Mais il peut être fait en utilisant la méthode d'injection ou en le rendant baenfactoryaware et chaque fois avant d'utiliser l'objet obtenir une nouvelle instance de l'usine le résoudra. –

-1

Vous pouvez essayer d'utiliser @Scope ("session")